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); } }
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); }
<item android:id="@+id/action_search" android:actionViewClass="android.widget.SearchView" android:showAsAction="always" android:title="@string/action_alarm"/>
能夠爲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.html。java
@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:定義以下方法,而後在須要顯示溢出菜單的activity的onCreate方法中調用該方法;學習
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中修改application的android: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,並參閱部分博客後寫的學習筆記,若有不足/有誤之處歡迎留言指出,謝謝!