Android中的ActionBar

在之前项目实践中,对于项目中自动显示并一直显示的位于屏幕顶端的标题栏我都采取requestWindowFeature(Window.FEATURE_NO_TITLE)的方法将其隐藏,其实它就是ActionBar了,Android 3.0以后ActionBar取代了传统的tittle bar和menu,成为了二者的结合。在某些应用开发中还是有用的,它的样式是这样的

 

<1> ActionBar的图标,可显示软件图标,也可用其他图标代替。(当软件不在最高级页面时,图标左侧会显示一个左箭头,用户可以通过这个箭头向上导航,这个效果是需要设置的)

<2> 如果你的应用要在不同的View中显示数据,这部分允许用户来切换视图。一般的作法是用一个下拉菜单或者是Tab选项卡。如果只有一个界面,那这里可以显示应用程序的标题或者是更长一点的商标信息

<3> 两个action按钮,这里放重要的按钮功能,为用户进行某项操作提供直接的访问

<4> overflow按钮,当屏幕容纳不下太多按钮时部分按钮会被置于overflow中

ActionBar的添加非常简单,只需要在AndroidManifest.xml中指定Application(默认有)或Activity的theme是Theme.Holo或其子类就可以了,在Android 3.0及更高的版本中,Activity中都默认包含有ActionBar组件。theme属性代表界面的风格,它有很多值,代表不同的界面风格,如果选择其中带有NoTitleBar的值ActionBar在界面中就不会显示了。在Activity中亦可以通过getActionBar()获取ActiongBar类使用show()方法和hide()方法来操控ActionBar的显示和隐藏,当然前提是配置文件中没有将其设为NoTitleBar(那样的话Activity中就不存在ActionBar类了)。

在配置文件中可以为ActionBar设置图标和标题:

icon属性会改变应用程序的图标(不设置有默认图标)

logo属性会改变ActionBar的图标(不设置默认为应用程序图标)

lable属性会改变ActionBar的标题

在menu.xml文件(菜单的设置文件)中可以为ActionBar添加菜单选项:

id:为菜单选项设定唯一标识id

icon:为菜单选项设定图片

title:为菜单选项设定文字(如果不设置会报错)

orderInCategory:为菜单选项设置顺序,数字从0开始,越小越靠左

showAsAction:设置菜单选项的显示格式(图标或文字)

always:总是显示在ActionBar面板上(显示在这里的菜单选项只能是图标,可以通过长按图标查看title内容,会在图标下弹出一个Toast显示,如果所有图标都是这个属性,如果选项太多将导致排在后面的选项挤出屏幕之外)

never:从不显示在ActionBar面板上

ifRoom:如果ActionBar面板上无法容纳就隐藏在overflow中(通过手机Menu键打开或按钮打开,默认情况overflow只能显示文字)

官方默认设置overflow中只显示文字不显示图片,如何让它显示图片呢,overflow中的Action按钮应不应该显示图标,是由MenuBuilder这个类的setOptionalIconsVisible变量来决定的,默认设为false,通过反射调用该方法将其设置为ture即可显示图片。

withText:只显示文字(只能显示在overflow里)

要想让ActionBar图标左边的返回小箭头出现并实现功能,需要通过调用setDisplayHomeAsUpEnabled()方法来启用ActionBar图标导航功能(在设置成功后,配置文件会自动添加一条allowBackup的属性)

ActionBar中的点击事件通过onOptionsItemSelected()方法实现。

除了菜单选项外,ActionBar还可以添加ActionView, ActionView是一种可以在ActionBar中替换Action按钮的控件,它可以允许用户在不切换界面的情况下通过ActionBar完成一些较为丰富的操作。比如说,你需要完成一个搜索功能,就可以将SeachView这个控件添加到ActionBar中。为了声明一个ActionView,我们可以在menu资源中通过actionViewClass属性来指定一个控件。

以下针对上面的描述做一个简单的测试,布局文件如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.briup.actionbar.MainActivity"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="ShowActionBar"
        android:onClick="show" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="HideActionBar"
        android:onClick="hide" />

</LinearLayout>

配置文件如下

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.briup.actionbar"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="24" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:icon="@drawable/cocktail"
            android:logo="@drawable/huahua"
            android:name=".MainActivity"
            android:label="@string/hello_world"
            android:theme="@android:style/Theme.Holo.Light" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Activity类文件如下

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.app.ActionBar;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.SearchView;
import android.widget.SearchView.OnQueryTextListener;
import android.widget.Toast;

public class MainActivity extends Activity {
	private ActionBar actionBar;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		actionBar = getActionBar();//获取ActionBar类
		actionBar.setDisplayHomeAsUpEnabled(true);//启动返回图标
	}
	public void show(View v){
		actionBar.show();
	}
	public void hide(View v){
		actionBar.hide();
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);//获取菜单选项资源
		MenuItem menuItem = menu.findItem(R.id.set3);//获取菜单选项按钮控件
		SearchView searchView = (SearchView) menuItem.getActionView();
		searchView.setOnQueryTextListener(new OnQueryTextListener() {
			
			@Override
			public boolean onQueryTextSubmit(String query) {
				// 输入法回车触发
				Toast.makeText(MainActivity.this, query, Toast.LENGTH_SHORT).show();
				return false;
			}
			
			@Override
			public boolean onQueryTextChange(String newText) {
				// 输入内容改变触发
				Toast.makeText(MainActivity.this, newText, Toast.LENGTH_SHORT).show();
				return false;
			}
		});
		return true;
	}
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case android.R.id.home://返回小箭头的ID
			finish();//退出
			break;
		}
		return super.onOptionsItemSelected(item);
	}
	@Override
	public boolean onMenuOpened(int featureId, Menu menu) {
		if(featureId==Window.FEATURE_ACTION_BAR&&menu!=null){//
			if(menu.getClass().getSimpleName().equals("MenuBuilder")){//通过反射获取MenuBuilder类
				try {
					Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);//通过方法名和参数类型定位方法
					method.setAccessible(true);//获取调用权限
					method.invoke(menu, true);//调用方法并传入参数
				} catch (NoSuchMethodException e) {
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					e.printStackTrace();
				}
			}
		}
		return super.onMenuOpened(featureId, menu);
	}
}

效果如下

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值