مشخصات مقاله
-
3166
-
0.0
-
8850
-
0
-
0
استفاده از Toolbar در اندروید
این مبحث تمرکز خود را بر روی آموزش نحوه ی پیاده سازی و استفاده از toolbar در اپلیکیشن های اندرویدی قرار می دهد. آموزش حاضر همچنین چگونگی استفاده از /widgetکامپوننت رابط کاربری toolbar را برای شما شرح می دهد. این آموزش مبتنی بر ویرایش 6.0 سیستم عامل اندروید می باشد (= API یا کتابخانه های اندروید ورژن 23).
آموزش مفهوم Toolbar
آموزش Toolbar در اندروید چیست و چه کاربردی دارد؟ (action bar)
Toolbar در ویرایش 5.0 سیستم عامل اندروید جای actionbar در اندروید 4 را گرفت تا محدودیت های جاری را برطرف ساخته و راه حلی نوین برای طراحی اپلیکیشن را در اختیار برنامه نویس قرار دهد. این widget یا کامپوننت UI از طریق view group به نام Toolbar در دسترس توسعه دهنده قرار می گیرد.
می توان toolbar را به راحتی در فایل layout جایگذاری نمود. این کامپوننت UI قادر است عنوان activity، آیکون، عملیاتی که قابل فعال سازی هستند (action ها) و حتی view ها و سایر آیتم های تعاملی را دربرگیرد. مورد دیگر استفاده ی toolbar در پیمایش و راهبری بین بخش های مختلف اپلیکیشن است.
قبل از ویرایش 5.0 اندروید، مکان قرار گیری نوار ابزار (همان actionbar در ویرایش های قبلی) به صورت ثابت در بالای صفحه یا activity بوده (در آنجا hard code شده بود).
اکنون این امکان وجود دارد که نوار ابزار را در پوسته ی مورد استفاده (theme) غیرفعال نمود. کامپوننت UI نام برده در تمامی پوسته های درون ساخته ی اندروید به صورت پیش فرض فعال می باشد.
تصویر زیر نوارابزار اپلیکیشن اندرویدی Google+ را به همراه آیتم های تعاملی و نوار راهبری (navigation) نشان می دهد.در بالای آن سمت چپ، علامتی قابل مشاهده است که کاربر می تواند با کلیک بر روی آن نوار راهبری را باز کرده و در اپلیکیشن پیمایش کند.
آموزش Actionbar بر روی دستگاه هایی که ورژن کتابخانه های اندروید مورد استفاده در آن ها پایین تر از 21 است (API 21)
Toolbar در ویرایش 5.0 اندروید (ورژن کتابخانه های اندروید 21) برای اولین بار معرفی شد و در واقع جایگزینی برای actionbar در ورژن های قبلی این سیستم عامل گردید. اگر می خواهید از این کاپوننت در ویرایش های قدیمی تر اندروید استفاده نمایید، در آن صورت کافی است از downport ای که توسط appcompat-v7 در اختیار توسعه دهنده قرار می گیرد، استفاده نمایید.
جهت استفاده از toolbar در چنین دستگاه هایی، دستوری مانند نمونه ی زیر را به فایل Gradle build خود اضافه نمایید:
compile `com.android.support:appcompat-v7:22.2.0`
برای آموزش نحوه ی نصب library v7 به آدرس http://developer.android.com/tools/support-library/setup.html مراجعه نمایید.
آموزش Options menu
اپلیکیشن هایی که target SDK آن ها بر روی پایین تر از API 11 تنظیم شده، از options menu استفاده می کنند. البته اگر چنین دکمه ای در دستگاه موجود باشد. این کامپوننت UI با کلیک کاربر بر روی دکمه ی Options به نمایش در می آید. Toolbar نسبت به options menu کاربر پسندتر است زیرا action bar همیشه قابل مشاهده و در دسترس است. در حالی که options menu فقط در صورت درخواست نمایان می شود. در واقع options menu یک کاستی برجسته دارد: ممکن است کاربر متوجه وجود گزینه ها و تنظیمات ارائه شده توسط اپلیکیشن نشود.
آموزش استفاده از Toolbar
آموزش تعریف آیتم های نوار ابزار/actions در toolbar
المان هایی که در نوارابزار مشاهده می کنید در اندروید actions خوانده می شوند. اگرچه می توان آیتم های نوار ابزار را با کدنویسی تعریف کرد، با این حال توسعه دهندگان معمولا آن ها را در یک فایل محتوا XML تحت پوشه ی res/ تعریف می کنند.
تعریف منوها در یک فایل مجزا تحت پوشه ی res/menu ذخیره می شوند. ابزار اندروید خود به صورت خودکار یک اشاره گر به آیتم های منو جهت دسترسی به منابع آن در فایل R ایجاد می کند.
یک activity معمولا entry ها را از طریق متد onCreateOptionsMenu() به نوارابزار تزریق می کند.
خصیصه (attribute) showAsAction به شما این اجازه را می دهد تا نحوه ی نمایش و ظاهر آیتم مورد نظر در نوارابزار را تعیین نمایید. به عنوان مثال، خصیصه ی ifRoom مشخص می کند آیا فضای کافی برای نمایش المان وجود دارد یا خیر.
کلاس MenuInflator این امکان را فراهم می آورد تا action های تعریف شده در فایل XML را inflate نموده (آن ها را جهت قرار گرفتن در activity به آبجکت view تبدیل کرده) سپس آن ها را به action bar اضافه نمایید. می توانید با فراخوانی getMenuInflator() در سطح activity به کلاس MenuInflator دسترسی داشته باشید. نمونه کد زیر نحوه ی پیاده سازی و ایجاد action ها را نمایش می دهد.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.mainmenu, menu);
return true;
}
اگرچه می توان action ها را در کد برنامه نیز تعریف کرد، با این حال توصیه می شود این کار را در فایل های XML انجام دهید چرا که میزان کدهای تکراری (boilerplate code) را کاهش می دهد.
آموزش عملیاتی که در پی انتخاب آیتم های نوارابزار رخ می دهند (واکنش نشان دادن به انتخاب action ها)
زمانی که action ای کلیک می شود، متد onOptionsItemSelected() در activity مربوطه فراخوانی می گردد. این متد action انتخابی را به عنوان پارامتر ورودی دریافت می کند. کاربرد این متد در نمونه ی زیر به نمایش گذاشته شده است.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// action with ID action_refresh was selected
case R.id.action_refresh:
Toast.makeText(this, "Refresh selected", Toast.LENGTH_SHORT)
.show();
break;
// action with ID action_settings was selected
case R.id.action_settings:
Toast.makeText(this, "Settings selected", Toast.LENGTH_SHORT)
.show();
break;
default:
break;
}
return true;
}
آموزش جستجو برای یک action یا آیتم در نوارابزار/action bar
به منظور جستجو برای یک action یا آیتم در منو، متد findItem() از کلاس Menu را فراخوانی نمایید. به وسیله ی این متد می توانید با استفاده از id یک آیتم به آن دسترسی داشته باشید.
آموزش ویرایش منو
متد () تنها یکبار صدا خورده می شود. در صورت نیاز به ویرایش منو در آینده، لازم است متد invalidateOptionsMenu() را فراخوانی نمایید. پس از آن تابع onCreateOptionsMenu() بار دیگر صدا زده می شود. onCreateOptionsMenu
آموزش Contextual action mode و toolbar (وابسته کردن toolbar به قرائن با استفاده از contextual action mode)
contextual action mode یک نوارابزار (وابسته به قرائن و بستر جاری) است که برای انجام subtask ها و وظایف کوچک برای مدت زمان معینی، به صورت موقتی بر روی نوارابزار اصلی اپلیکیشن ظاهر می شود.
contextual action mode معمولا با انتخاب یک آیتم یا کلیک طولانی مدت بر روی آن ظاهر می شود.
به منظور پیاده سازی این نوع toolbar، کافی است متد startActionMode() را بر روی یک viewer در activity خود فراخوانی نمایید. متد نام برده آبجکت ActionMode.Callback را دریافت می کند. این آبجکت وظیفه ی مدیریت چرخه ی حیات contextual action bar را بر عهده است. همچنین می توانید با استفاده از متد registerForContexMenu(view)، یک منوی وابسته به قرائن/context menu به view مورد نظر اختصاص دهید. Context menu نیز با کلیک طولانی مدت بر روی view مورد نظر فعال می شود.
هر بار که یک context menu فعال می شود، متد onCreateContextMenu() نیز فراخوانی می شود. می دانید چرا؟ context menu پس از هر بار استفاده کاملا دور انداخته می شود.
توصیه می شود تا حد امکان بجای context menu از contextual action mode استفاده نمایید.
آموزش اضافه نمودن آیتم به action bar با استفاده از fragment ها
Fragment ها نیز می توانند آیتم و المان هایی را به نوارابزار یا toolbar اپلیکیشن اضافه کنند. برای نیل به این هدف، می بایست متد setHasOptionsMenu(true) را در متد onCreate() از fragment مورد نظر فراخوانی نمایید.framework یا چارچوب نرم افزاری Android در این شرایط متد onCreateOptionsMenu() را در کلاس fragment فراخوانی می کند.در این حالت fragment می تواند آیتم های منو را به toolbar اضافه کند.
آموزش تنظیم قابلیت رویت (visibility) و دسترسی toolbar
می توانید قابلیت رویت و visibility نوارابزار را در زمان اجرای برنامه تنظیم نمایید. کد زیر نحوه ی انجام این کار را به نمایش می گذارد.
ActionBar actionBar = getActionBar(); actionBar.hide(); // more stuff here... actionBar.show();
شما می توانید متنی که همراه با آیکون اپلیکیشن در زمان اجرای برنامه (runtime) نمایش داده می شود را ویرایش نمایید. تکه کد زیر نحوه ی انجام این کار را نمایش می دهد.
ActionBar actionBar = getActionBar();
actionBar.setSubtitle("mytest");
actionBar.setTitle("vogella.com");
آموزش تخصیص یک عکس drawable به action bar
این امکان نیز برای شما وجود دارد که یک Drawable را از طریق متد ActionBar.setBackgroundDrawable() به عنوان پس زمنیه و background نوارابزار خود تنظیم نمایید.
Toolbar اپلیکیشن خود عکس را مقیاس دهی کرده و با توجه فضای جاری اندازه بندی می کند. از اینرو بهتر است که یک فایل drawable انعطاف پذیر و قابل تنظیم فراهم می کنید. برای مثال می توانید یک عکس 9-patch یا یک drawable با فرمت XML را به عنوان عکس پس زمینه ارائه نمایید.
از ویرایش 4.2 سیستم عامل اندروید، پس زمینه ی action bar را نیز می توان با استفاده از AnimationDrawable متحرک یا پویا نمایی کرد.
آموزش پنهان یا کم رنگ کردن دکمه ی پیمایش (diming navigation button)
شما می توانید دکمه ی پیمایش نرم افزاری مورد نظر را در اپلیکیشن اندرویدی خود پنهان نموده و بدین وسیله فضای بیشتری در دسترس داشته باشید. زمانی که کاربر بر روی دکمه ی صفحه کلیک می کند، دکمه ی پیمایش به صورت خودکار نمایان می شود.
کد لازم برای پیاده سازی این قابلیت در زیر به نمایش گذاشته شده است.
getWindow().
getDecorView().
setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
تصاویر زیر یک اپلیکیشن را با/بدون دکمه های پیمایش نمایش می دهد.
آموزش استفاده از حالت نمایش تمام صفحه (immersive full screen mode)
از ویرایش 4.4 (ورژن کتابخانه های اندروید یا API 19) به بعد، شما می توانید اپلیکیشن خود را در حالت نمایش تمام صفحه قرار دهید (immersive full screen mode). اولین باری که این اتفاق می افتد، سیستم اندروید اطلاعاتی را به کاربر نشان می دهد. این اطلاعات حاکی از این است که کاربر می تواند با حرکت downward swipe (لمس سطح نمایشگر به سمت پایین در ناحیه ای که نوارابزار سیستم معمولا قابل مشاهده می باشد) اپلیکیشن را به حالت قبلی بازگردانده و system bar ها را بار دیگر به نمایش بگذارد.
به عنوان مثال، متد زیر activity یا صفحه ی جاری اپلیکیشن را در حالت تمام صفحه قرار می دهد.
// This method hides the system bars and resize the content
private void hideSystemUI() {
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
// remove the following flag for version < API 19
| View.SYSTEM_UI_FLAG_IMMERSIVE
);
}
آموزش پیاده سازی قابلیت دو نیم کردن نوار ابزار (split toolbar)
می توانید به سیستم اعلان نمایید که در صورت عدم وجود فضای کافی، نوارابزار را به صورت خودکار به دو نیم تقسیم کند. جهت فعال سازی این قابلیت می توانید پارامتر android:uiOptions="SplitActionBarWhenNarrow" را در تعریف activity اپلیکیشن خود داخل فایل AndroidManifest.xml لحاظ نمایید.
با فعال سازی گزینه ی مزبور، اندروید می تواند نوار ابزار را به دو بخش تقسیم کند. سپس سیستم بر اساس فضای جاری و در زمان اجرای برنامه تصمیم می گیرد آیا نوارابزار را به دو بخش تقسیم کند یا خیر.
هدف
در تمرین جاری، شما یک contextual action mode به اپلیکیشن خود اضافه خواهید نمود.
آموزش ایجاد محتوا و منابع مربوطه/menu resource در پوشه ی res/menu
برای این منظور، یک فایل XML حامل محتوای منو (xml resource menu) با نام actionmode.xml ایجاد نمایید. برای جزئیات بیشتر به
آموزش تنظیم و ویرایش کد برنامه
ابتدا interface مربوط به fragment را به صورت زیر ارث بری نمایید.
public class MyListFragment extends Fragment {
public void goToActionMode(RssItem item) {
listener.goToActionMode(item);
}
public interface OnItemSelectedListener {
public void onRssItemSelected(String link);
public void goToActionMode(RssItem item);
}
کلاس activity خود را جهت پیاده سازی متد جدید و ActionMode.Callback به صورت زیر ویرایش نمایید.
package com.example.android.rssreader;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
import android.widget.Toolbar;
import com.example.android.rssfeedlibrary.RssItem;
public class RssfeedActivity extends Activity
implements MyListFragment.OnItemSelectedListener,
ActionMode.Callback {
private RssItem selectedRssItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar tb = (Toolbar) findViewById(R.id.toolbar);
setActionBar(tb);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
Toolbar tb = (Toolbar) findViewById(R.id.toolbar);
tb.inflateMenu(R.menu.mainmenu);
tb.setOnMenuItemClickListener(
new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return onOptionsItemSelected(item);
}
});
return true;
}
//NEW
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_refresh:
MyListFragment fragment = (MyListFragment) getFragmentManager()
.findFragmentById(R.id.listFragment);
fragment.updateListContent();
break;
case R.id.action_settings:
Intent intent = new Intent(this, MyPreferences.class);
startActivity(intent);
Toast.makeText(this, "Action Settings selected", Toast.LENGTH_SHORT)
.show();
break;
default:
break;
}
return true;
}
@Override
public void onRssItemSelected(String link) {
if (getResources().getBoolean(R.bool.twoPaneMode)) {
DetailFragment fragment = (DetailFragment) getFragmentManager()
.findFragmentById(R.id.detailFragment);
fragment.setText(link);
} else {
Intent intent = new Intent(getApplicationContext(),
DetailActivity.class);
intent.putExtra(DetailActivity.EXTRA_URL, link);
startActivity(intent);
}
}
@Override
public void showContextMenu(RssItem item) {
this.selectedRssItem = item;
startActionMode(this);
}
@Override
public void goToActionMode(RssItem item) {
this.selectedRssItem = item;
startActionMode(this);
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.actionmode, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, "I found this interesting link" +
selectedRssItem.getLink());
intent.setType("text/plain");
startActivity(intent);
mode.finish(); // Action picked, so close the CAB
selectedRssItem = null;
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
}
در کلاس adapter خود، یک LongClickListener پیاده سازی نمایید. با پیاده سازی interface مزبور، contextual action mode فعال و راه اندازی می شود.
package com.example.android.rssreader;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.example.android.rssfeedlibrary.RssItem;
import java.util.List;
import java.util.Random;
public class RssItemAdapter
extends RecyclerView.Adapter {
private List rssItems;
private MyListFragment myListFragment;
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v= null;
v = LayoutInflater.
from(parent.getContext()).
inflate(R.layout.rowlayout, parent, false);
return new ViewHolder(v);
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public View mainLayout;
public TextView txtHeader;
public TextView txtFooter;
public ImageView imageView;
public ViewHolder(View v) {
super(v);
mainLayout = v;
txtHeader = (TextView) v.findViewById(R.id.rsstitle);
txtFooter = (TextView) v.findViewById(R.id.rssurl);
imageView = (ImageView) v.findViewById(R.id.icon);
}
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
final RssItem rssItem = rssItems.get(position);
holder.txtHeader.setText(rssItem.getTitle());
holder.txtFooter.setText(rssItem.getLink());
holder.mainLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myListFragment.updateDetail(rssItem.getLink());
}
});
holder.mainLayout.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
myListFragment.goToActionMode(rssItem);
return true;
}
});
}
@Override
public int getItemCount() {
return rssItems.size();
}
public RssItemAdapter(List rssItems, MyListFragment myListFragment) {
this.rssItems = rssItems;
this.myListFragment = myListFragment;
}
}
آموزش Dynamic تعریف کردن action bar
آموزش View هایی با پیاده سازی اختصاصی در action bar
می توانید یک view اختصاصی به action bar اضافه نمایید. برای مثال، یک button یا text field در نوار ابزار اپلیکیشن خود داشته باشید.
برای این منظور، لازم است متد setCustomView از کلاس ActionView را بکار ببرید. سپس بایستی با فراخوانی متد setDisplayOptions() و ارسال پارامتر ActionBar.DISPLAY_SHOW_CUSTOM به آن، امکان نمایش view های اختصاصی در toolbar را فعال سازی نمایید.
به طور مثال، می توانید یک فایل layout تعریف کنید که دربردارنده ی المان EditText می باشد.
این layout را می توان به وسیله ی کد زیر به action bar در activity مورد نظر متصل کرد. تکه کد زیر علاوه بر متصل کردن layout، یک گوش فراخوان یا listener نیز به custom view الحاق می کند.
package com.vogella.android.actionbar.customviews;
import android.app.ActionBar;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar = getActionBar();
// add the custom view to the action bar
actionBar.setCustomView(R.layout.actionbar_view);
EditText search = (EditText) actionBar.getCustomView().findViewById(
R.id.searchfield);
search.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
Toast.makeText(MainActivity.this, "Search triggered", Toast.LENGTH_LONG).show();
return false;
}
});
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM
| ActionBar.DISPLAY_SHOW_HOME);
}
}
آموزش Action view
Action view یک کامپوننت UI یا widget هست که بجای دکمه ی آیتم (action در نوارابزار) نمایش داده می شود. با استفاده از این ویژگی می توانید یک آیتم (action) را با آبجکت Progressbar یا هر view مجاز دیگری جایگزین نمایید. به منظور تعریف یک action view جایگزین برای آیتم (action) در toolbar، می توانید خصیصه (attribute) android:actionLayout را جهت ایجاد فایل layoutو خصیصه ی android:actionViewClass را جهت تعریف widget class مورد استفاده قرار دهید.
این جایگزینی در تصاویر زیر به نمایش گذاشته شده است.
Activity زیر آیکون را در زمان اجرا برنامه با action view ای که حامل یک آبجکت ProgressBar می باشد، جایگزین می نماید.
package com.vogella.android.actionbar.progress;
import android.app.ActionBar;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
private MenuItem menuItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar = getActionBar();
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME
| ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_CUSTOM);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_load:
menuItem = item;
menuItem.setActionView(R.layout.progressbar);
menuItem.expandActionView();
TestTask task = new TestTask();
task.execute("test");
break;
default:
break;
}
return true;
}
private class TestTask extends AsyncTask {
@Override
protected String doInBackground(String... params) {
// Simulate something long running
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
menuItem.collapseActionView();
menuItem.setActionView(null);
}
};
}
کد زیر، محتوای layout مورد استفاده ی action view را نشان می دهد.
کد زیر فایل های XML که برای منو استفاده می شود را نشان می دهد.
آموزش Action provider
آموزش Action provider چیست و چه کاربردی دارد؟
Action provider در واقع همان action است که layout اختصاصی خود را دارد. Action در ابتدا ممکن است به صورت یک button یا آیتم در منو ظاهر شود، اما زمانی که کاربر بر روی action کلیک می کند، action provider رفتار action را بر اساس تعریف شما، کنترل و هدایت می کند. برای مثال، action bar می تواند با نمایش یک منو به کلیک کاربر واکنش نشان دهد. به عبارت دیگر، action provider به شما امکان می دهد تا قابلیت تعامل و رفتار پیچیده را در قالب تنها یک action به راحتی پیاده سازی نمایید. این action قادر است action view هایی تولید کند که در action bar استفاده می شوند، زیرمنوها را به صورت پویا و در زمان اجرای اپلیکیشن با داده پر کند و فراخوانی های پیش فرض action را مدیریت نماید.
کلاسی که action bar از آن مشتق می شود، کلاس پایه/پدر ActionProvider می باشد.
در حال حاضر، محیط اندروید (Android platform) دو action provider زیر را در اختیار توسعه دهندگان قرار می دهد: 1. MediaRouteActionProvider 2. ShareActionProvider.
تمرین زیر استفاده از ShareActionProvider را نمایش می دهد. این action provider به شما اجازه می دهد تا محتوای انتخابی را از اپلیکیشن هایی که Intent.ACTION_SEND را ثبت کرده اند، دریافت نمایید.
جهت استفاده از ShareActionProvider، می بایست یک آیتم در منو ویژه ی آن تعریف کرده و intent ای به آن تخصیص دهید که داده های مورد نظر برای اشتراک را دربرمی گیرد.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
// Get the ActionProvider for later usage
provider = (ShareActionProvider) menu.findItem(R.id.menu_share)
.getActionProvider();
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_share:
doShare();
break;
default:
break;
}
return true;
}
public void doShare() {
// populate the share intent with data
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "This is a message for you");
provider.setShareIntent(intent);
}
آموزش پیمایش در اپلیکیشن از طریق آیکون
آموزش استفاده از آیکون اپلیکیشن در action bar جهت راهبری به صفحه ی اصلی
در action bar آیکونی از اپلیکیشن خود را مشاهده می کنید. آیتم مزبور home icon نام داشته و شما می بایست یک action به آن اختصاص دهید. بهتر است کاربر با کلیک بر روی آیکون، به صفحه ی اصلی برنامه (main activity) هدایت شود.
پس از انتخاب شدن action مورد نظر، متد onOptionsItemSelected() همراه با آیتم یا action ای صدا خورده می شود که شناسه یا ID آن android.R.id.home باشد.
پیش از ویرایش 4.1 اندروید، توسعه دهنده می بایست شناسه android.R.id.home را در متد onOptionMenuItemSelected() بکار می برد و امکان انتخاب دکمه ی home را فعال سازی می کرد. این عملیات در کد زیر به نمایش گذاشته شده است. آیکون home در SecondActivity کاربر را به MainActivity در اپلیکیشن هدایت می کند.
package com.vogella.android.actionbar.homebutton;
import android.os.Bundle;
import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuItem;
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// enable the home button
ActionBar actionBar = getActionBar();
actionBar.setHomeButtonEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
break;
// Something else
case R.id.action_settings:
intent = new Intent(this, ThirdActivity.class);
startActivity(intent);
default:
break;
}
return super.onOptionsItemSelected(item);
}
}
از Android 4.1 به بعد، برنامه نویس می تواند با برابر قرار دادن مقدار parentActivityName با نام activity پدر (برای مثال "MainActivity") در فایل تنظیمات اپلیکیشن (AndroidManifest.xml)، به راحتی کاربر را از activity دوم به activity اصلی هدایت کرده و تعیین کند که کاربر با کلیک بر روی آیکون home به activity اصلی برنامه ارجاع داده شود.
آموزش استفاده از آیکون اپلیکیشن به عنوان دکمه ی Up
می توانید از آیکون اپلیکیشن به عنوان دکمه ی Up استفاده نمایید به طوری که کاربر با کلیک بر روی آن به activity میزبان که پدر activity کنونی هست، هدایت شود. دکمه ی back در دستگاه همیشه کاربر را به activity یا صفحه ی قبلی بازگشت می دهد.
رفتار و کاربرد هر دو دکمه را می توان متفاوت تعریف کرد، برای مثال زمانی که کاربر آپشنی را فعال کند که به او اجازه ی نوشتن ایمیل از صفحه ی اصلی را می دهد، برنامه را گونه ای تعریف کرده باشید که کلیک روی دکمه ی back کاربر را به صفحه ی اصلی و کلیک بر روی دکمه ی Up کاربر را به activity ای که نمایی مختصر از تمامی ایمیل ها ارائه می دهد، هدایت نماید.
به منظور فعال سازی Up، می توانید تکه کد زیر را در activity خود اضافه نمایید.
actionBar.setDisplayUseLogoEnabled(false); actionBar.setDisplayHomeAsUpEnabled(true);
درج تکه کد بالا در کلاس activity صرفا Up را بر روی آیکون home فعال می سازد. شما بایستی رفتار لازم را در کلاس activity خود و داخل متد onOptionsItemSelected() پیاده سازی نمایید. action مربوطه همچنان با همان شناسه ی android.R.id.home فراخوانی می شود.
پروژه
در این بخش action و آیتم هایی تعاملی در action bar ایجاد خواهید نمود که به انتخاب کاربر واکنش نشان می دهند.
تمرینی که در بخش حاضر دنبال می کنیم مبتنی بر آموزش fragment است. اگر قبلا پروژه ی آن را نوشته اید می توانید همان را دوباره استفاده کنید.
آموزش افزودن آیکون refresh در نوار ابزار
پروژه ی RSS Reader را ادامه دهید. با طی نمودن میسر زیر یک drawable به نام ic_refresh ایجاد نمایید: File ▸ New ▸ Vector Asset. یک تصویر مناسب از نمونه های جاری انتخاب نمایید.
آموزش اضافه کردن منابع لازم برای منو
یک فایل XML جدید به نام mainmenu.xml ایجاد نمایید. سپس یک آیتم به فایل مورد نظر اضافه کنید، طوری که فایل XML نهایی ظاهری مشابه زیر داشته باشد. می بایست این آیتم ها را به صورت دستی تایپ کنید چرا که محیط کاری Android Studio تا زمان نگارش آموزش حاضر، این قابلیت را ندارد که کدهای ساخت منوها را به صورت خودکار برای توسعه دهنده تکمیل کند.
یک فایل XML جدید به نام listfragment_menu.xml برای منوی اپلیکیشن خود تولید نمایید. سپس یک آیتم مانند زیر به فایل اضافه کنید تا فایل XML نهایی ظاهری مشابه زیر داشته باشد. می بایست این آیتم ها را خود به صورت دستی بنویسید چرا که تا زمان نگارش آموزش حاضر، محیط کاری Android Studio قابلیت تکمیل خودکار کدها را ندارد.
آموزش غیرفعال کردن action bar پیش فرض از طریق تگ style
از آنجایی که برای پروژه از toolbar اختصاصی خود استفاده می کنید، لازم است action bar پیش فرض را در فایل res/values/styles.xml غیر فعال نمایید.
آموزش اضافه کردن یک آبجکت (view) toolbar به layout activity
فایل های layout مربوط به RssfeedActivity خود را طوری ویرایش کنید که آیتم (toolbar entry) زیر را دربرداشته باشد.
همین کار را برای نمای عمودی (portrait mode) نیز انجام دهید.
بدنه ی کلاس RssfeedActivity خود را جهت تنظیم آبجکت toolbar مانند زیر ویرایش نمایید.
package com.example.android.rssreader;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.FrameLayout;
import android.widget.Toast;
import android.widget.Toolbar;
public class RssfeedActivity extends Activity implements
MyListFragment.OnItemSelectedListener {
// as before
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rssfeed);
//
Toolbar tb = (Toolbar) findViewById(R.id.toolbar);
setActionBar(tb);
// more code as before
}
//
@Override
public boolean onCreateOptionsMenu(Menu menu) {
Toolbar tb = (Toolbar) findViewById(R.id.toolbar);
tb.inflateMenu(R.menu.mainmenu);
tb.setOnMenuItemClickListener(
new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return onOptionsItemSelected(item);
}
});
return true;
}
//
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_settings:
Toast.makeText(this, "Action Settings selected", Toast.LENGTH_SHORT).show();
return true;
default:
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onRssItemSelected(String link) {
// more code as before
}
}
تست اپلیکیشن
اپلیکیشن خود را اجرا نموده و هر دو action را انتخاب کنید. بایستی با انتخاب آیتم های مختلف در نوارابزار یک پیغام Toast برای کاربر به نمایش گذاشته شود.
تمرین: فعال سازی عملیات refresh/بروز رسانی آیتم های MyListFragment از طریق toolbarبرای تست اپلیکیشن شما می خواهید recycler view تنها زمانی که کاربر refresh را از toolbar انتخاب می کند (از طریق swipe-to-refresh یا قابلیت لمس اپلکیشن به پایین جهت بروز رسانی آیتم های لیست) با داده پر شود. بنابراین، recycler view یا لیست شما در ابتدای امر بایستی تهی باشد.
آموزش حذف داده های اولیه
در پروژه ی RSS Reader خود، فراخوانی updateListContent() را از بدنه ی متد onCreate() کلاس MyListFragment خود حذف نمایید.
آموزش بروز رسانی MyListFragment، در صورتی که refresh انتخاب شد
منطق Refresh را در کلاس RssfeedActivity خود پیاده سازی نمایید. حال زمانی که کاربر refresh را انتخاب می کند، متد updateListContent() در MyListFragment صدا خورده می شود.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_refresh:
//TODO
// find fragment via FragmentManager and call updateListContent() on it.
break;
default:
break;
}
return true;
}