ActionBar學習筆記(二)

8、在ActionBar上添加導航tab

    Tabs的應用能夠算是很是普遍了,它可使得用戶很是輕鬆地在你的應用程序中切換不一樣的視圖。而Android官方更加推薦使用ActionBar中提供的Tabs功能,由於它更加的智能,能夠自動適配各類屏幕的大小。

    爲ActionBar添加導航tab主要有以下幾步:

    1. 得到ActionBar對象,並設置ActionBar的導航模式爲tabs模式;

    2. 建立須要顯示在ActionBar上的tabs,並設置這些選項卡的title和icon,爲tabs添加監聽器;

    3. 經過ActionBar的addTab方法將tab添加到ActionBar上;

    首先,我建立了一個實現了ActionBar.TabListener接口的類,代碼以下:

public class CustomTabListener<T extends Fragment> implements TabListener {
 private Fragment mFragment;
 private Activity mActivity;
 private Class<T> mClass;
 public CustomTabListener(Activity activity, Class<T> clz) {
  mActivity = activity;
  mClass = clz;
 }
 @Override
 public void onTabReselected(Tab tab, FragmentTransaction ft) {
 }
 @Override
 public void onTabSelected(Tab tab, FragmentTransaction ft) {
   Toast.makeText(mActivity, "Change tab", 3000).show();
 }
 @Override
 public void onTabUnselected(Tab tab, FragmentTransaction ft) {
  // ft.detach(mFragment);
 }
}

    而後在activity的onCreate方法中寫了一個initView方法,方法內容爲:

private void initView() {
  // 得到ActionBar
  ActionBar actionBar = getActionBar();
  // 設置導航模式爲選項卡模式
  actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
  // 建立三個選項卡
  Tab nearTab = actionBar.newTab();
  Tab shakeTab = actionBar.newTab();
  Tab bootleTab = actionBar.newTab();
  // 爲三個選項卡設置文本和icon
  nearTab.setText("Near").setIcon(R.drawable.near);
  shakeTab.setText("Shake").setIcon(R.drawable.shake);
  bootleTab.setText("Bootle").setIcon(R.drawable.bottle);
  // 爲三個選項卡添加監聽器
  nearTab.setTabListener(new CustomTabListener<NearFragment>(this,
    NearFragment.class));
  shakeTab.setTabListener(new CustomTabListener<ShakeFragment>(this,
    ShakeFragment.class));
  bootleTab.setTabListener(new CustomTabListener<BottleFragment>(this,
    BottleFragment.class));
  // 將三個選項卡添加到actionBar上
  actionBar.addTab(nearTab);
  actionBar.addTab(shakeTab);
  actionBar.addTab(bootleTab);
 }

    這樣就成功地將tab添加到ActionBar上了,效果以下:

    

    點擊某一個選項卡時,就會顯示一次toast消息。

9、添加Action View

    ActionView是一種能夠在ActionBar中替換Action按鈕的控件,它能夠容許用戶在不切換界面的狀況下經過ActionBar完成一些較爲豐富的操做。好比說,你須要完成一個搜索功能,就能夠將SeachView這個控件添加到ActionBar中。

    爲了聲明一個ActionView,咱們能夠在menu資源中經過actionViewClass屬性來指定一個控件

<item
        android:id="@+id/action_search"
        android:actionViewClass="android.widget.SearchView"
        android:showAsAction="always"
        android:title="@string/action_alarm"/>

    而後按照上面添加Action Button的步驟進行即可以將Action View添加到ActionBar上,效果以下(圖一和圖二分別表示Action View收起和展開時的樣子):

    能夠爲Action View添加響應事件,方法爲重寫onCreateOptionsMenu方法,在該方法中得到Action View對象,而後爲該Action View對象添加OnActionExpandListener和onMenuItemActionCollapse監聽器,這樣當SearchView展開的時候就會回調onMenuItemActionExpand()方法,當SearchView合併的時候就會調用onMenuItemActionCollapse()方法,咱們在這兩個方法中進行相應的UI操做就能夠了html

    關於SearchView的更多詳細用法,能夠參考官方文檔 http://developer.android.com/guide/topics/search/search-dialog.htmljava

@Override
 public boolean onCreateOptionsMenu(Menu menu) {
  MenuInflater inflater = getMenuInflater();
  inflater.inflate(R.menu.menu_action_bar_02, menu);
  MenuItem searchItem = menu.findItem(R.id.action_search);
  // 爲action view添加響應事件
  searchItem.setOnActionExpandListener(new OnActionExpandListener() {
   @Override
   public boolean onMenuItemActionExpand(MenuItem item) {
    Log.d(TAG, "on expand");
    Toast.makeText(getApplicationContext(), "expand",
      Toast.LENGTH_SHORT).show();
    return true;
   }
   @Override
   public boolean onMenuItemActionCollapse(MenuItem item) {
    Log.d(TAG, "on collapse");
    Toast.makeText(getApplicationContext(), "collapse",
      Toast.LENGTH_SHORT).show();
    return true;
   }
  });
  return super.onCreateOptionsMenu(menu);
 }

    10、overflow溢出菜單不顯示android

    問題:在有些機器上overflow溢出菜單並不會顯示web

     緣由:Android系統默認首先會判斷該機器是否有物理菜單鍵,若是有物理菜單鍵則不顯示溢出菜單,將溢出菜單中的內容經過用戶點擊物理菜單鍵進行顯示;若是沒有物理菜單鍵則顯示溢出菜單;app

    解決辦法:若是想要然全部的機器均可以顯示溢出菜單,能夠經過以下方法實現ide

     辦法1定義以下方法,而後在須要顯示溢出菜單的activityonCreate方法中調用該方法;學習

1.  <!--  強制顯示overflow menu -->
2.  private void getOverflowMenu() {  
3.          try {  
4.              ViewConfiguration config = ViewConfiguration.get(this);  
5.              Field menuKeyField = ViewConfiguration.class 
6.                      .getDeclaredField("sHasPermanentMenuKey");  
7.              if (menuKeyField != null) {  
8.                  menuKeyField.setAccessible(true);  
9.                  menuKeyField.setBoolean(config, false);  
10.             }  
11.         } catch (Exception e) {  
12.             e.printStackTrace();  
13.         }  
14.     }

 

    辦法2自定義一個Application以下,而後在AndroidManifest.xml中修改applicationandroid:name=".UIApplication"(注意路徑)這樣在該應用的全部activity中都會顯示overflow menu菜單ui

    注:該方法只針對Android 4.0以上系統有效,其他系統可使用PopupWindow實現相似功能this

1.  public class UIApplication extends Applications{  
2.      public void onCreate() {        try {  
3.              ViewConfiguration config = ViewConfiguration.get(this);  
4.              Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");  
5.              if (menuKeyField != null) {  
6.                  menuKeyField.setAccessible(true);  
7.                  menuKeyField.setBoolean(config, false);  
8.              }  
9.          }  
10.         catch (Exception ex) {  
11.             // Ignore  
12.         }  
13.         super.onCreate();  
14.     }  
15. }

    原理:在ViewConfiguration這個類中有一個叫作sHasPermanentMenuKey的靜態變量,系統就是根據這個變量的值來判斷手機有沒有物理Menu鍵的。所以咱們能夠經過修改該變量的值而使得系統認爲此機器無物理菜單鍵,從而顯示溢出菜單spa

11、讓overflow中的選項顯示icon

    問題:overflow中的選項只顯示title,而不會顯式icon

     緣由:這是Google官方的默認效果,Google認爲隱藏在overflow中的Action按鈕都應該只顯示文字。

    解決辦法:其實,overflow中的Action按鈕應不該該顯示圖標,是由MenuBuilder這個類的setOptionalIconsVisible變量來決定的,若是咱們在overflow被展開的時候將這個變量賦值爲true,那麼裏面的每個Action按鈕對應的圖標就都會顯示出來了。

    代碼以下:

 /**
  * 改變setOptionalIconsVisible的值,使得overflow可以顯示icon
  */
 @Override
 public boolean onMenuOpened(int featureId, Menu menu) {
  if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {
   if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
    try {
     Method m = menu.getClass().getDeclaredMethod(
       "setOptionalIconsVisible", Boolean.TYPE);
     m.setAccessible(true);
     m.invoke(menu, true);
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }
  return super.onMenuOpened(featureId, menu);
 }

    效果以下:

    以上即是本人這兩天根據官方training學習ActionBar,並參閱部分博客後寫的學習筆記,若有不足/有誤之處歡迎留言指出,謝謝!

相關文章
相關標籤/搜索