ActionBar
简介
- 屏幕部的工具栏
设置ActionBar
图标和文字
- 可以在
<application>
或者<activity>
中通过android:logo
来进行指定图标:<activity android:name="com.example.actionbartest.MainActivity" android:label="天气" android:logo="@drawable/weather" > </activity>
获取ActionBar
ActionBar actionBar = getActionBar();
隐藏ActionBar
ActionBar actionBar = getActionBar();
actionBar.hide();
子标题
ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
if (actionBar != null){
actionBar.setSubtitle(/* String */);
}
OptionsMenu
简介
- 在工具栏上面显示的菜单。
简单示例
XML
代码
在 menu_quiz.xml 中:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".QuizActivity">
<item
android:id="@+id/action_settings"
android:title="@string/action_settings"
android:orderInCategory="100"
app:showAsAction="never"/>
</menu>
解说
-
tools:context
可以使当前布局文件得知Activity
的主题,从而便于根据渲染上下文预览。 -
app:showAsAction
:-
never
:不显示。 -
always
:显示。 -
ifRoom|withText
:如果空间足够,显示图片及文字;否则,仅显示图片,或不显示隐藏到溢出菜单中。
-
创建菜单选项代码
// 在Activity或Fragment中
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_quiz, menu);
return true;
}
设置菜单子项
// 在onCreateOptionsMenu中
MenuItem menuItem = menu.findItem(R.id.menu_item_1);
menuItem.setTitle(/* String */);
处理菜单选项事件
- 更新选项菜单的子项时,需要调用
invalidateOptionsMenu()
通知更新。// 在Activity或Fragment中 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_settings: // doSomething return true; default: return super.onOptionsItemSelected(item); } }
选项菜单子项发生变化时
// 通知变化
getActivity().invalidateOptionsMenu();
层级导航
简介
- 后退按钮导航和层级导航(向上按钮导航)并不一样。层级导航是开始一个新的
Activity
,弹出回退栈里此Activity
以上的Activity
。后退按钮导航则是弹出回退栈里最顶层的Activity
。
第一步
- 在 AndroidManifest.xml 中的
Activity
里设置android:parentActivityName
:<activity android:name=".BActivity" android:label="@string/app_name" android:parentActivityName=".AActivity"> </activity>
第二步
// 效果为ActionBar图标左侧会出现一个向左的箭头。
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
第三步
- 【待验证】似乎可以省略这一步。
@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;
}
}
ActionView
SearchView
简单示例
XML文件
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_item_search"
android:title="@string/search"
android:icon="@drawable/ic_search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="ifRoom|collapseActionView"/>
</menu>
代码
// 在Activity或Fragment中
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_activity_actions, menu);
MenuItem searchItem = menu.findItem(R.id.menu_item_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
/* 完成输入,点击搜索 */
/* do something */
// 隐藏键盘
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getActivity().getWindow().getDecorView().getWindowToken(), 0);
searchView.onActionViewCollapsed();
return true;
}
@Override
public boolean onQueryTextChange(String s) {
/* do something */
return false;
}
});
searchView.setOnSearchClickListener(/* 进入输入状态 */);
return super.onCreateOptionsMenu(menu);
}
示例解说
-
XML 部分:
-
app:actionViewClass
:ActionView
可以放在ActionBar
上,可以通过定制ActionView
实现自己想要的功能。 -
app:showAsAction
:collapseActionView
可能会导致显示文字而不是图标。
-