将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);
}