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