启用和关闭ActionBar

android 3.0(API 11)以上默认启动ActionBar。
如果不想使用ActionBar,这可以在AndroidManifest.xml文件中修改:

<application
        android:allowBackup="true" //是否将程序加入到系统的备份和恢复架构中
        android:icon="@mipmap/ic_launcher"//设置ActionBar图标
        android:label="@string/app_name"//设置ActionBar标题
        android:theme="Theme.AppCompat.Light.NoActionBar">

或者在代码中使用hide()方法:

public class MainActivity extends AppCompatActivity {
    ActionBar actionBar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        actionBar = getSupportActionBar();//如果继承的是Activity,则使用getActionBar
        actionBar.hide();
    }

添加ActionBar的菜单选项

本来看着教程,觉得ActionBar挺简单,跟着教程敲了同样的代码,结果就出现了红线(提示错误),我那个郁闷啊,明明一模一样的代码怎么就错了那!我用的是android-studio:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">
    <item
        android:id="@+id/item1"
        android:title="item1"
        android:showAsAction="never"/>//这里提示出错
</menu>

后来经过查找才找到问题所在,因为android-studio默认地导入了appcompat.v7这个包,这个是Google自己的一个向下兼容包,能够让低版本显示高版本的界面。因为有这个包的存在,想要设置showAsAction这个属性,按如下修改:

<?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"//添加这个命名空间
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">
    <item
        android:id="@+id/item1"
        android:title="item1"
        app:showAsAction="never"/>//此处改为app:showAsAction
</menu>

为什么这样改就可以了那?首先我们先看 xmlns:android=”http://schemas.android.com/apk/res/android”
刚开始学的就注意这一行代码了,但是一直不知道是什么意思,于是就去查了一下,才明白这行代码有什么用,也和这里的showAsAction属性有关。
”xmlns“是”XML Namespaces“的缩写,意思是命名空间,作用就是指定在代码所用的固定词汇去哪里找。”http://schemas.android.com/apk/res/android“这是res资源的标准前缀,后面的这个android是一个包名。也就是我们使用android命名空间的资源定义的路径在android这个包名之下。例如我们经常使用的”android:id“这个属性,这里的”id“属性就是在名为”android“的命名空间里找的,也就是后面的路径里找,于是有了这个属性的作用:编号。
而这里我们用到的showAsAction属性,如果导入了appcompat.v7这个包,就要在”http://schemas.android.com/apk/res-auto“这个路径找,因此需要添加一个这个路径的命名空间。
ps:如果直接使用android:showAsAction,但对于早期的版本来说android命名空间下不存在这个属性,就不能看到ActionBar的效果,而这个属性的定义存在于support V7 里面,所以可以兼容之前的版本。
当然这里的”app“是可以改为任意字符的,只要用的时候也用对应的字符就可以了。例如改成这样:

xmlns:a="http://schemas.android.com/apk/res-auto"

使用的时候:

a:showAsAction="never"

这下问题就解决了。

顺带着说下 xmlns:tools=”http://schemas.android.com/tools” ,这是一个工具的命名空间,有了它我们就可以使用这个路径下的属性了,例如:tools:text等。这些属性有什么用那?在写布局代码的时候,IDE可以看到布局的预览效果,但是有些效果则必须在运行之后才能看见,例如:TextView在xml中没有设置任何字符,而是在activity中设置了text。为了在预览中看到效果,你必须在xml中为TextView控件设置android:text属性,看完效果后在删除,这样就显得很麻烦。而这个tools工具就是可以让我们能够更好地查看预览效果,例如上面这个例子,就可以直接添加一个 tools:text属性,可以达到相同的预览效果,优点就是不用去管他,因为这个属性只在预览的时候有效,程序真正运行的时候是不存在的。

menu元素可以包含如下子元素:

item:菜单项;
group: 菜单组;
checkableBehavior:指定该组菜单的选择行为,可指定:none(不可选)、all(多选)、single(单选);
visible:指定是否可见;
enable:指定是否可用;

item元素可以包含如下子元素:

android:id
android:title
android:icon
android:checkable
android:checked
android:visible
android:enable
android:alphabeticShortcut 指定字符快捷键
android:numberShortcut 指定数字快捷键
android:showAsAction 显示为ActionBar的菜单项,可指定:always表示永远显示在ActionBar中,如果屏幕空间不够则无法显示;ifRoom表示屏幕空间够的情况下显示在ActionBar中,不够的话就显示在overflow(三个点)中;never则表示永远显示在overflow中。

继续!写完menu的xml文件后,要重写onCreateOptionsMenu()方法:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = new MenuInflater(this);
        inflater.inflate(R.menu.menu,menu);
        return super.onCreateOptionsMenu(menu);
    }

这样就完成了,运行一下试试。

Action选项的点击事件

虽然有了选项,但是目前还没有什么用,接着可以添加选项的点击事件,只需要重写activity的onOptionsItemSelected()方法就可以了,在其中判断点击的是哪个item,并写上点击事件:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.item1:
            //省略了点击事件
                return true;
            case R.id.item2:
            //省略了点击事件
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

应用程序图标导航

我们可以通过调用ActionBar的setDisplayHomeAsUpEnabled()方法来启用图标导航功能:

public class MainActivity extends AppCompatActivity {
    ActionBar actionBar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);

    }

这样图标转变成可点击的图标,并在图标上添加一个向左的箭头。
接着,可以在onOptionsItemSelected()方法中添加点击事件了:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.item1:
                return true;
            case R.id.item2:
                return true;
            case android.R.id.home:
                return true;
        }
        return super.onOptionsItemSelected(item);
    }