启用和关闭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);
}