【Android】actionbar显示选项菜单
2016-09-18 08:31
393 查看
Actionbar是android3.0的重要更新之一。Actionbar位于传统标题栏的位置,也就是显示在屏幕的顶部。
Actionbar提供了如下功能:
1.显示选项菜单optionsMenu的菜单项(Action Item)。
2.使用程序图标作为返回Home主屏或向上的导航操作。
3.提供交互式View作为Action View。
4.提供基于Tab的导航方式,可用于切换多个Fragment。
5.提供基于下拉的导航方式。
下面来看看Actionbar用于显示选项菜单以及Action View。
Activity类:
[java]
view plain
copy
print?
package com.zzj.ui.actionbardemo;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.app.ActionBar;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.ViewConfiguration;
import android.view.Window;
import android.widget.Toast;
import com.zzj.ui.R;
public class ActionbarActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.actionbar_activity);
ActionBar actionBar = getActionBar();
// 是否显示应用程序图标,默认为true
actionBar.setDisplayShowHomeEnabled(true);
// 是否显示应用程序标题,默认为true
actionBar.setDisplayShowTitleEnabled(true);
/*
* 是否将应用程序图标转变成可点击的按钮,默认为false。
*
* 如果设置了DisplayHomeAsUpEnabled为true,
*
* 则该设置自动为 true。
*/
actionBar.setHomeButtonEnabled(true);
/*
* 在应用程序图标的左边显示一个向左的箭头,
*
* 并且将HomeButtonEnabled设为true。
*
* 默认为false。
*/
actionBar.setDisplayHomeAsUpEnabled(true);
forceShowOverflowMenu();
}
/**
* 如果设备有物理菜单按键,需要将其屏蔽才能显示OverflowMenu
*/
private void forceShowOverflowMenu() {
try {
ViewConfiguration config = ViewConfiguration.get(this);
Field menuKeyField = ViewConfiguration.class
.getDeclaredField("sHasPermanentMenuKey");
if (menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.actionbar_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
/*
* 将actionBar的HomeButtonEnabled设为ture,
*
* 将会执行此case
*/
case android.R.id.home:
finish();
break;
case R.id.add:
Toast.makeText(this, "添加", Toast.LENGTH_LONG).show();
break;
// 其他省略...
default:
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
setOverflowIconVisible(featureId, menu);
return super.onMenuOpened(featureId, menu);
}
/**
* 显示OverflowMenu的Icon
*
* @param featureId
* @param menu
*/
private void setOverflowIconVisible(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) {
Log.d("OverflowIconVisible", e.getMessage());
}
}
}
}
}
主布局文件没什么,省略......
菜单文件res/menu/actionbar_menu.xml:
[html]
view plain
copy
print?
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- action items -->
<!-- showAsAction默认为never -->
<item
android:id="@+id/delete1"
android:icon="@android:drawable/ic_menu_camera"
android:showAsAction="always"
android:title="拍照"/>
<item
android:id="@+id/add"
android:icon="@android:drawable/ic_menu_add"
android:showAsAction="ifRoom"
android:title="添加">
</item>
<item
android:id="@+id/delete2"
android:icon="@android:drawable/ic_menu_edit"
android:showAsAction="ifRoom"
android:title="编辑"/>
<item
android:id="@+id/share"
android:icon="@android:drawable/ic_menu_share"
android:showAsAction="never"
android:title="分享"/>
<item
android:id="@+id/call"
android:icon="@android:drawable/ic_menu_call"
android:showAsAction="never"
android:title="呼叫"/>
<item
android:id="@+id/delete3"
android:icon="@android:drawable/ic_menu_help"
android:showAsAction="never"
android:title="帮助"/>
<!-- action views -->
<item
android:id="@+id/search"
android:actionViewClass="android.widget.SearchView"
android:showAsAction="always"
android:title="查询"/>
<item
android:id="@+id/clock"
android:actionLayout="@layout/actionbar_layout_menu"
android:showAsAction="always"
android:title="时钟"/>
</menu>
时钟布局文件actionbar_layout_menu.xml:
[html]
view plain
copy
print?
<?xml version="1.0" encoding="utf-8"?>
<AnalogClock xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</AnalogClock>
效果:
代码解释见代码中的注释。
Actionbar提供了如下功能:
1.显示选项菜单optionsMenu的菜单项(Action Item)。
2.使用程序图标作为返回Home主屏或向上的导航操作。
3.提供交互式View作为Action View。
4.提供基于Tab的导航方式,可用于切换多个Fragment。
5.提供基于下拉的导航方式。
下面来看看Actionbar用于显示选项菜单以及Action View。
Activity类:
[java]
view plain
copy
print?
package com.zzj.ui.actionbardemo;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.app.ActionBar;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.ViewConfiguration;
import android.view.Window;
import android.widget.Toast;
import com.zzj.ui.R;
public class ActionbarActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.actionbar_activity);
ActionBar actionBar = getActionBar();
// 是否显示应用程序图标,默认为true
actionBar.setDisplayShowHomeEnabled(true);
// 是否显示应用程序标题,默认为true
actionBar.setDisplayShowTitleEnabled(true);
/*
* 是否将应用程序图标转变成可点击的按钮,默认为false。
*
* 如果设置了DisplayHomeAsUpEnabled为true,
*
* 则该设置自动为 true。
*/
actionBar.setHomeButtonEnabled(true);
/*
* 在应用程序图标的左边显示一个向左的箭头,
*
* 并且将HomeButtonEnabled设为true。
*
* 默认为false。
*/
actionBar.setDisplayHomeAsUpEnabled(true);
forceShowOverflowMenu();
}
/**
* 如果设备有物理菜单按键,需要将其屏蔽才能显示OverflowMenu
*/
private void forceShowOverflowMenu() {
try {
ViewConfiguration config = ViewConfiguration.get(this);
Field menuKeyField = ViewConfiguration.class
.getDeclaredField("sHasPermanentMenuKey");
if (menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.actionbar_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
/*
* 将actionBar的HomeButtonEnabled设为ture,
*
* 将会执行此case
*/
case android.R.id.home:
finish();
break;
case R.id.add:
Toast.makeText(this, "添加", Toast.LENGTH_LONG).show();
break;
// 其他省略...
default:
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
setOverflowIconVisible(featureId, menu);
return super.onMenuOpened(featureId, menu);
}
/**
* 显示OverflowMenu的Icon
*
* @param featureId
* @param menu
*/
private void setOverflowIconVisible(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) {
Log.d("OverflowIconVisible", e.getMessage());
}
}
}
}
}
主布局文件没什么,省略......
菜单文件res/menu/actionbar_menu.xml:
[html]
view plain
copy
print?
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- action items -->
<!-- showAsAction默认为never -->
<item
android:id="@+id/delete1"
android:icon="@android:drawable/ic_menu_camera"
android:showAsAction="always"
android:title="拍照"/>
<item
android:id="@+id/add"
android:icon="@android:drawable/ic_menu_add"
android:showAsAction="ifRoom"
android:title="添加">
</item>
<item
android:id="@+id/delete2"
android:icon="@android:drawable/ic_menu_edit"
android:showAsAction="ifRoom"
android:title="编辑"/>
<item
android:id="@+id/share"
android:icon="@android:drawable/ic_menu_share"
android:showAsAction="never"
android:title="分享"/>
<item
android:id="@+id/call"
android:icon="@android:drawable/ic_menu_call"
android:showAsAction="never"
android:title="呼叫"/>
<item
android:id="@+id/delete3"
android:icon="@android:drawable/ic_menu_help"
android:showAsAction="never"
android:title="帮助"/>
<!-- action views -->
<item
android:id="@+id/search"
android:actionViewClass="android.widget.SearchView"
android:showAsAction="always"
android:title="查询"/>
<item
android:id="@+id/clock"
android:actionLayout="@layout/actionbar_layout_menu"
android:showAsAction="always"
android:title="时钟"/>
</menu>
时钟布局文件actionbar_layout_menu.xml:
[html]
view plain
copy
print?
<?xml version="1.0" encoding="utf-8"?>
<AnalogClock xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</AnalogClock>
效果:
代码解释见代码中的注释。
相关文章推荐
- Android ActionBar详解(二)--->使用ActionBar显示选项菜单
- ActionBar详解(二)--->使用ActionBar显示选项菜单
- android,actionbar,menu显示,图片,菜单禁用★★★
- ActionBar最近学习整理之一:显示选项内容及菜单项
- ActionBar 显示选项菜单
- ActionBar详解(二)--->使用ActionBar显示选项菜单
- adt的windows菜单下无法显示Android SDK Manager选项
- Android -- ActionBar上的三点菜单显示不出来问题
- Android之Menu菜单 onCreateOptionsMenu使用Menu按键显示不了问题
- Android菜单详解(二)——创建并响应选项菜单
- 4、从头学Android之Menu选项菜单
- Android开发--身高体重指数(BIM)计算--添加菜单(Menu)(菜单功能、创建菜单、处理选项动作)
- android菜单详解二:选项菜单
- 【原创】解决Eclipse 安装过程中preference 菜单不出现Android 选项的的办法
- Android之Menu选项菜单
- Android 通过按钮弹出菜单(通过Button显示菜单)
- android sdk<10的情况下,系统才会显示三个点的菜单~~
- Android 程式开发:(九)使用活动栏 —— 9.1隐藏或显示ActionBar
- Android之Menu菜单 onCreateOptionsMenu使用Menu按键显示不了问题
- android菜单详解二:选项菜单