【Android】actionbar显示选项菜单

Actionbar是android3.0的重要更新之一。Actionbar位于传统标题栏的位置,也就是显示在屏幕的顶部。

Actionbar提供了如下功能:

1.显示选项菜单optionsMenu的菜单项(Action Item)。

2.使用程序图标作为返回Home主屏或向上的导航操作。

3.提供交互式View作为Action View。

4.提供基于Tab的导航方式,可用于切换多个Fragment。

5.提供基于下拉的导航方式。


下面来看看Actionbar用于显示选项菜单以及Action View。

Activity类:

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:

<?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:
<?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>
效果:


代码解释见代码中的注释。


  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
1. 创建菜单资源文件 在res目录下的menu文件夹中创建一个menu.xml文件,用于定义选项菜单的布局和内容。例如: ```xml <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_item1" android:title="Item 1" /> <item android:id="@+id/menu_item2" android:title="Item 2" /> <item android:id="@+id/menu_item3" android:title="Item 3" /> </menu> ``` 2. 加载菜单资源文件 在Activity中的onCreateOptionsMenu()方法中加载菜单资源文件。例如: ```java @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); return true; } ``` 3. 处理菜单项点击事件 在Activity中的onOptionsItemSelected()方法中处理菜单项的点击事件。例如: ```java @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_item1: // 处理菜单项1的点击事件 return true; case R.id.menu_item2: // 处理菜单项2的点击事件 return true; case R.id.menu_item3: // 处理菜单项3的点击事件 return true; default: return super.onOptionsItemSelected(item); } } ``` 4. 在布局文件中显示选项菜单 在布局文件中添加一个Toolbar控件,并在Activity中将其设置为ActionBar,从而显示选项菜单。例如: ```xml <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:title="@string/app_name" app:titleTextColor="@android:color/white" /> <!-- 其他控件 --> ``` ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值