Android ActionBar使用筆記

將actionbar常用方法整理,以便以後使用.

一. 實現action bar:
1.修改styles.xml 文件

<resources>
    <style name="AppTheme" parent="@android:style/Theme.Holo.Light">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>

注意: 將AppTeme的父類改成@android:style/Theme.Holo.Light 因爲主題應該是Theme.Holo 或 Theme.Holo的子類才能顯示actionbar

2.創建action bar的佈局文件
在menu下創建activity_actions.xml文件, 例如:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_search"
        android:icon="@mipmap/ic_action_search"
        android:title="搜索"
        android:showAsAction="always" />
    <item android:id="@+id/action_settings"
         android:title="設置"
        android:showAsAction="ifRoom"/>
</menu>

shouAsAction屬性可以是以下值:
(1) alaways: 這個值會使菜單項一直顯示在ActionBar上
(2) ifRoom: 如果有足夠的空間,這個值會使菜單顯示在ActionBar上
(3) never: 這個值菜單永遠不會出現在ActionBar
(4) withText: 這個值使菜單和它的圖標, 菜單文本一起顯示。

3.在使用的activty中添加代碼:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        //將菜單佈局引入
        inflater.inflate(R.menu.main_activity_actions, menu);
        return super.onCreateOptionsMenu(menu);
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_search:
                //TODO:進行對應邏輯處理
                return true;
            case R.id.action_settings:
                //TODO:進行對應邏輯處理
                return true;
            default:
            return super.onOptionsItemSelected(item);
        }
    }

效果:

這裏寫圖片描述

二. 添加 Up Button

這裏寫圖片描述

1.首先在onCreate中添加下面代碼:

  setContentView(R.layout.activity_main);
  ActionBar actionBar = getActionBar();
  actionBar.setDisplayHomeAsUpEnabled(true);

2.需要在AndroidManifest.xml中配置父Activity

 <activity android:name=".XXXActivity">
             <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.XXXX.XXXX.MainActivity" />
 </activity>

在4.1後可以寫成:

<activity 
    android:name=".TabActivity"
    android:parentActivityName=".MainActivity" > 
</activity> 

3.對android.R.id.home這個事件ID進行一些處理

@Override 
public boolean onOptionsItemSelected(MenuItem item) {  
    switch (item.getItemId()) {  
    case android.R.id.home:  
        Intent upIntent = NavUtils.getParentActivityIntent(this);  
        if (NavUtils.shouldUpRecreateTask(this, upIntent)) {  
            TaskStackBuilder.create(this)  
                    .addNextIntentWithParentStack(upIntent)  
                    .startActivities();  
        } else {  
            upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
            NavUtils.navigateUpTo(this, upIntent);  
        }  
        return true;  
        ......  
    }  
}

三. 實現有搜索框的功能
1.修改menu目錄下的activity_action.xml中的sreach, 添加actionViewClass屬性:

    <item android:id="@+id/action_search"
        android:icon="@mipmap/ic_action_search"
        android:actionViewClass="android.widget.SearchView"
        android:title="搜索"
        android:showAsAction="always" />

2.對SearchView進行屬性配置

@Override 
public boolean onCreateOptionsMenu(Menu menu) {  
    MenuInflater inflater = getMenuInflater();  
    inflater.inflate(R.menu.main, menu);  
    MenuItem searchItem = menu.findItem(R.id.action_search);  
    SearchView searchView = (SearchView) searchItem.getActionView();  
    // 配置SearchView的屬性  
    //......  
    return super.onCreateOptionsMenu(menu);  
}  

四. overflow按鈕不顯示問題
如果手機有menu物理按鍵的話, 我們在menu中的xml裏配置的屬性showAsAction爲never的item, 將不會顯示.

如何處理? 通過反射獲得sHasPermanentMenuKey方法, 讓它永遠返回false

@Override 
protected void onCreate(Bundle savedInstanceState) {  
    ......  
    setOverflowShowingAlways();  
}  

private void setOverflowShowingAlways() {  
    try {  
        ViewConfiguration config = ViewConfiguration.get(this);  
        Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");  
        menuKeyField.setAccessible(true);  
        menuKeyField.setBoolean(config, false); //設置爲false 
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
}

五. 讓Overflow按鈕中的選項顯示圖標
overflow中的Action按鈕應不應該顯示圖標,是由MenuBuilder這個類的setOptionalIconsVisible方法來決定的. 傳入true顯示圖標.

@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) {  
            }  
        }  
    }  
    return super.onMenuOpened(featureId, menu);  
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章