Android ActionBar使用笔记

来源:互联网 发布:中山大学网络教育官网 编辑:程序博客网 时间:2024/06/06 00:37

将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);  }
0 0
原创粉丝点击