Android学习笔记:ActionBar使用介绍
一、基本要素
最权威性和官方网的详细介绍可以看google的api文档
http://developer.android.com/training/basics/actionbar/setting-up.html
http://developer.android.com/guide/topics/ui/actionbar.html
ActionBar故称思义,实际操作栏的含意,一般坐落于activity的顶端,能够置放文字标识,输入框、按键、标志等。是 Android3才适用的。
在eclipse建立一个默认设置的activity,运行后如下图所显示,默认设置表明了app的标志和app的name,留意挑选不一样的版本号很有可能有稍微差别。
大家再看看google api文档上给的事例图
上边图上,①是app的标志;②是2个实际操作按键,一个是检索按键;③是overflow按键(overflow的含意 后边再详细介绍)。
二、设定无法显示ActionBar
假如要想Activity无法显示ActionBar,能够有二种方式:
1)在 AndroidManifest.xml中特定Application或Activity的theme如:
android:theme=”@android:style/Theme.Light.NoTitleBar”
2)在activity的onCreate事情中根据编码设定,以下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar = getActionBar();
actionBar.hide();
}
那样,activity就不容易表明ActionBar了。
三、变更默认设置标志和题目
默认设置状况下,activity会应用AndroidManifest.xml中application的icon特性特定的照片来做为ActionBar的标志,如:
<application
android:allowBackup=”true”
android:icon=”@drawable/ic_launcher”
可是大家还可以更改这一默认设置个人行为,如果我们要想应用此外一张图片来做为ActionBar的标志,能够设定activity的logo特性来开展特定。
例如新项目的res/drawable文件目录下有一张mylogo.png图片,就可以在AndroidManifest.xml中那样特定:
<activity
android:logo=”@drawable/mylogo”
题目能够根据设定环境变量中的 android:label 特性来设定,还可以根据编码来设定,如:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setTitle("我的应用"); }
四、加上实际操作按键
1、最先在 res\menu文件目录下提升环境变量,如 main.xml (用eclipse建立的时候会默认设置建立该文件)
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.testactionbar.MainActivity" > <item android:id="@ id/action1" android:icon="@drawable/a1" android:showAsAction="always" android:title="action1"/> <item android:id="@ id/action2" android:icon="@drawable/a2" android:showAsAction="ifRoom" android:title="action2"/> <item android:id="@ id/action3" android:icon="@drawable/a3" android:showAsAction="never" android:title="action3"/> </menu>
上边的文档中,根据item标签提升了3个实际操作按键。<item>标识中又有一些特性,在其中id是该Action按键的唯一标志符,icon用以特定该按键的标志,title用以特定该按键很有可能表明的文本(在设定了标志的状况下,ActionBar上不容易表明文本),showAsAction则特定了该按键表明的部位,关键有下列几类值可选择:always表明始终表明在ActionBar中,假如显示屏室内空间不足则不显示;ifRoom表明显示屏室内空间够的状况下表明在ActionBar中,不足得话就表明在overflow中;never则表明始终表明在overflow中(它是默认设置状况)。
2、然后,重写Activity的onCreateOptionsMenu()方式,编码以下所显示:
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; }
如果是用eclipse建立的工程项目,这一段编码缺省会城市出示。
五、加上实际操作按键的回应事情
当点一下实际操作按键时,能够开启事情,在事情编码中能够作出自身的解决,如表明新界面。当客户点一下Action按键的情况下,系统软件会启用Activity的onOptionsItemSelected()方式,根据方式传到的MenuItem主要参数,我们可以启用它的getItemId()方式和menu資源中的id开展较为,进而鉴别出客户点一下的是哪一个Action按键,随后作出相对的实际操作,如:
@Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case R.id.action1: Toast.makeText(this, "i am" item.getTitle(), Toast.LENGTH_SHORT).show(); return true; case R.id.action2: Toast.makeText(this, "i am" item.getTitle(), Toast.LENGTH_SHORT).show(); return true; case R.id.action3: Toast.makeText(this, "i am" item.getTitle(), Toast.LENGTH_SHORT).show(); return true; default: return super.onOptionsItemSelected(item); } }
六、Overflow按键无法显示的状况
尽管如今大家早已把握了许多 ActionBar的使用方法,可是如果你真实去应用它的情况下還是很有可能会碰到各式各样的难题,例如很多人都是会遇到overflow按键无法显示的状况。本来是一样的一份编码,overflow按键在有一些手机会表明,而在有一些手机偏要就无法显示,这是为什么呢?之后我小结了一下,overflow按键的表明状况和手机上的硬件配置状况是有关系的,假如手机上沒有物理学Menu键得话,overflow按键就可以表明;如果有物理学Menu键得话,overflow按键就不容易表明出去,这时候仅有按住物理学按键后才表明掩藏在overflow中的按键。 但很有可能许多客户不清楚这一点。
@Override protected void onCreate(Bundle savedInstanceState) { ...... setOverflowShowingAlways(); } private void setOverflowShowingAlways() { try { ViewConfiguration config = ViewConfiguration.get(this); Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); } catch (Exception e) { e.printStackTrace(); } }
那样只需有表明不全的按键,overflow按键便会一直表明了。
七、让Overflow中的选择项表明标志
假如你点一下一下overflow按键去查询掩藏的Action按键,你能发觉这些Action按键全是只表明文本无法显示标志的。
@Override public boolean onMenuOpened(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) { } } } return super.onMenuOpened(featureId, menu); }
能够见到,这儿大家重写了一个onMenuOpened()方式,当overflow被进行的情况下便会回调函数这一方式,然后在这个方式的內部根据回到反射面的方式将MenuBuilder的setOptionalIconsVisible自变量设定为true就可以了。