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