به کار گیری ACTION BAR
بسم الله الرحمن الرحیم
به کار گیری ACTION BAR
فصل سوم-بخش دوم
درکنار Fragment ها یک ویژگی جدی در اندروید 3 و 4 ActionBar هامی باشند. در روش سنتی در بالای صفحه عنوان برنامه قرار می گرفت.
Action Bar عنوان برنامه همراه با ایکن نمایش می دهند. به طور معمولی در سمت راست ایتم های Action Bar قرار دارند .
در شکل زیر برنامه Email که در سیستم عامل اندروید وجود دارد را مشاهده می کنیدکه عنوان برنامه همراه با Icon و, ایتم های ActionBar رانمایش میدهد
در قسمت زیر به شما نمایش میدهیم که چگونه به صورت برنامه نویسی ActionBar نمایش و مخفی کنید.
پروژه جدیدی را به نام MyActionBar ایجاد کنید.
کلیدF11 را فشار دهید تا برنامه اجرا شود. همان طورکه مشاهده می کنید
ActionBar برنامه همراه با نام MyActionBar و ایکن در بالای صفحه همرا به عنوان نمایش داده شده است.
برای مخفی کردن Title برنامه فایل AndroidManifest.xml به صورت زیر تغییر دهید
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.MehrdadJavidi.myactionbar"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="14" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<android:theme="@android:style/Theme.Holo.NoActionBar" >
</intent-filter>
</activity>
</application>
</manifest>
برنامه را اجرا کنید.
شما می توانیدActionBar به صورت برنامه نویسی با کلاسActionBar حذف کنید.
برای این کار قدم اول این می باشد که شما باید صفت android:theme را در قسمت قبلی حذف کنید. اگر این کار را انجام ندهید برنامه با خطا روبرو می شود.
دستورات زیر را به فایل MainActivity.java اضافه کنید
package com.MehrdadJavidi.myactionbar;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.app.ActionBar;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionBar actionBar = getActionBar();
actionBar.hide();
/**actionBar.show();*/ /**---show it again---
}
}
برنامه را اجراکنید و نتیجه را مشاهده کنید.
توضیحات
صفت android:theme شما قادر می سازد تا ActionBarرا مخفی کنید.تنظیم این صفت به
“@android:style/Theme.Holo.NoActionBar” باعث می شود ActionBarمخفی شود.و در زمان اجرا شما می توانیدgetActionBar()با متد به آن اشاره کنیدو سپس متد hide() رافراخوانی کنید که باعث مخفی شدن آن می شود. شما بافراخوانی متد show()می توانید آن رانمایش دهید.
نکته مهم اینجا است که اگر شما ACtionBarراباصفت android:theme مخفی کنید و سپس متدgetActionBar() در زمان اجرا فراخوانی کنید مقدار null بر می گرداند.بهتر است که ActionBarرابا در زماناجراباکلاسActionBarمخفی ویا نمایش دهید.
اضافه کردن آیتم های Actionبه ActionBar
در کنار نمایش عنوان برنامه و آیکن برنامه در ActionBar شما می توانید آیتم های اضافی دیگری را نمایش دهید.
این آیتم های اضافی را action itenms می گویند.
Action item ها یک shortcut از کار های رایج در بر نامه کاربردی شما می باشد.به عنوان مثال شما ممکن یک برنامه RSS Reader بنویسید .که بعضی از Action Barها می تواندRefresh feed,” “Delete feed” and “Add new feed.” باشند.
در زیر به شما نشان میدهیم که چگونه میتوانید action Bar را اضافه کنید
به پروژه قبلی رفتی MyActionBar دستورات زیر را به فایلMainActivity.java اضافه کنید
package com.MehrdadJavidi.myactionbar;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/**ActionBar actionBar = getActionBar();*/
/**actionBar.hide();*/
/**actionBar.show();*/ /**---show it again---*/
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
CreateMenu(menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
return MenuChoice(item);
}
private void CreateMenu(Menu menu)
{
MenuItem mnu1 = menu.add(0, 0, 0, "Item 1");
{
mnu1.setIcon(R.drawable.ic_launcher);
mnu1.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
MenuItem mnu2 = menu.add(0, 1, 1, "Item 2");
{
mnu2.setIcon(R.drawable.ic_launcher);
mnu2.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
MenuItem mnu3 = menu.add(0, 2, 2, "Item 3");
{
mnu3.setIcon(R.drawable.ic_launcher);
mnu3.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
MenuItem mnu4 = menu.add(0, 3, 3, "Item 4");
{
mnu4.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
MenuItem mnu5 = menu.add(0, 4, 4, "Item 5");
{
mnu5.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
}
private boolean MenuChoice(MenuItem item)
{
switch (item.getItemId()) {
case 0:
Toast.makeText(this, "You clicked on Item 1",
Toast.LENGTH_LONG).show();
return true;
case 1:
Toast.makeText(this, "You clicked on Item 2",
Toast.LENGTH_LONG).show();
return true;
case 2:
Toast.makeText(this, "You clicked on Item 3",
Toast.LENGTH_LONG).show();
return true;
case 3:
Toast.makeText(this, "You clicked on Item 4",
Toast.LENGTH_LONG).show();
return true;
case 4:
Toast.makeText(this, "You clicked on Item 5",
Toast.LENGTH_LONG).show();
return true;
}
return false;
}
}
کلید F11 رافشار دهید تا برنامه اجرا شود.
شما می توانید ایکنهای را در شمت راستActonBar مشاهیده کنید.
شما با کلید بر روی دکمهMenu در Emulatorمنورا مشاهدهکنید.
که این مورد overfl ow menu شناخته می شود در بر خی از وسیله های که د ارای دکمه Menu نمی بشاد بقیه منو با یک ایکن با علامت arrow. نمایش داده می شود شکل زیر Asus Eee Pad Transformer (Android 3.2.1). را نمایش می دهد با کلید بر رویover Flow Meu بقیه منو نمایش داده می شود.
با کلیک بر روی منو با عت می شود کلاسToast متن منوی کلیک شده را بر روی صفحه نمایش دهد.
با فشار دادن ctr+F11 orientation مربوط به صفحه را به حال تغییرlandscape دهید شما حالا می توانید 4 عنصر Action Items ها را مشاهده کنید.
توضیحات
برای ایجادaction itemها شما باید متد onCreateOptionsMenu() مربوط به مربوط به activity را فراخوانی کنید
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
CreateMenu(menu);
return true;
}}
در کد بالا متد CreateMenu را فرواخوانی کرده ایم که آیتم های منو را نمایش می دهید
private void CreateMenu(Menu menu) private void CreateMenu(Menu menu)
{
MenuItem mnu1 = menu.add(0, 0, 0, "Item 1");
{
mnu1.setIcon(R.drawable.ic_launcher);
mnu1.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
MenuItem mnu2 = menu.add(0, 1, 1, "Item 2");
{
mnu2.setIcon(R.drawable.ic_launcher);
mnu2.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
MenuItem mnu3 = menu.add(0, 2, 2, "Item 3");
{
mnu3.setIcon(R.drawable.ic_launcher);
mnu3.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
MenuItem mnu4 = menu.add(0, 3, 3, "Item 4");
{
mnu4.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
MenuItem mnu5 = menu.add(0, 4, 4, "Item 5");
{
mnu5.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
}
برای اینکه منو ها به صورت اکشن بار نمایش داده شود شما باید متد setShowAsAction() همرا ه با ثابت SHOW_AS_ACTION_IF_ROOM فراخوانی کنید . این دستور به دستگاه اندروید می گوید اگر در action bar فضا وجود داشتد آنها را رادر آن فضا نمایش بدهبد.
وقتی یک منو توسط کاربر انتخاب می شود متد onOptionsItemSelected() فراخوانی می شود
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
return MenuChoice(item);
}
اینجا یک تابع تعرف کرده ایم که تعیین می کند کدام ایتم منو کلیک شده است.
و نام ایتم انتخاب شده را نمایش می هد
private boolean MenuChoice(MenuItem item)
{
switch (item.getItemId()) {
case 0:
Toast.makeText(this, "You clicked on Item 1",
Toast.LENGTH_LONG).show();
return true;
case 1:
Toast.makeText(this, "You clicked on Item 2",
Toast.LENGTH_LONG).show();
return true;
case 2:
Toast.makeText(this, "You clicked on Item 3",
Toast.LENGTH_LONG).show();
return true;
case 3:
Toast.makeText(this, "You clicked on Item 4",
Toast.LENGTH_LONG).show();
return true;
case 4:
Toast.makeText(this, "You clicked on Item 5",
Toast.LENGTH_LONG).show();
return true;
}
return false;
}
شخصی سازی کردن(Customizing) action Itemها و ایکن مربوط به برنامه
در مثال قبل شما menu itemها بدون متن نمایش داده می شدند
اگر شما بخواهید یک متن همراه ایکن نمایش داده شود شام باید ثابت MenuItem.SHOW_AS_ACTION_WITH_TEXT را با علامت | به متد setShowAsAction( ارسال کنید
MenuItem mnu1 = menu.add(0, 0, 0,"Item 1");
{
mnu1.setIcon(R.drawable.ic_launcher);
mnu1.setShowAsAction(
MenuItem.SHOW_AS_ACTION_IF_ROOM |
MenuItem.SHOW_AS_ACTION_WITH_TEXT);
}
برنامه دارای ایکن می باشد زمانی که بر روی آن کلیک می کنیم روی داد onOptionsItemSelected() مانند ایتم های action bar اجرا می شود برای اینکه تشخیص دهیم که ایکن برنامه انتخاب شده یا ایتم های action abr باید از ثابت
استفاده android.R.id.home کنید
private boolean MenuChoice(MenuItem item)
{
switch (item.getItemId()) {
case android.R.id.home:
Toast.makeText(this,
"You clicked on the Application icon",
Toast.LENGTH_LONG).show();
return true;
case 0:
Toast.makeText(this, "You clicked on Item 1",
Toast.LENGTH_LONG).show();
return true;
case 1:
Toast.makeText(this, "You clicked on Item 2",
Toast.LENGTH_LONG).show();
return true;
case 2:
Toast.makeText(this, "You clicked on Item 3",
Toast.LENGTH_LONG).show();
return true;
case 3:
Toast.makeText(this, "You clicked on Item 4",
Toast.LENGTH_LONG).show();
return true;
case 4:
Toast.makeText(this, "You clicked on Item 5",
Toast.LENGTH_LONG).show();
return true;
}
return false;
}
برای اینکه شما امکان کلیک کردن بر روی آیکن برنامه را بد هید باید متد setDisplayHomeAsUpEnabled() را فرواخوانی کنید
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
/**ActionBar actionBar = getActionBar();*/
/**actionBar.hide();*/
/**actionBar.show();*/ /**---show it again---*/
}
آیکن برنامه اغلب به کار گرفته می شود و زمانیهای استفاده می شود که شما می خواهید به Activity اصلی برنامه باز گردید. به عنوان مثال برنامه شما چند activity دارد شما می توانید از ایکن برنامه یک shortcut به activity اصلی برنامه داشنه باشید. برای این کار و به عنوان یک تمرین خوب شما می توانید شی intent را با فلگ FLAG_ACTIVITY_CLEAR_TOP تنظیم کنید.
switch (item.getItemId()) {
case android.R.id.home:
Toast.makeText(this,
"You clicked on the Application icon",
Toast.LENGTH_LONG).show();
Intent i = new Intent(this, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
فلگ Intent.FLAG_ACTIVITY_CLEAR_TOP به شما اطمینان می دهد مجموع activity های که در back stack قرار دارند زمانی که کاربر بر روی ایکن برنامه کلیک کردحذف شوند.
این روش باعث می شود زمانی که کاربر دکمه back را زد دیگر activity ها نمایش داه نشود.