添加导航栏----(2)添加导航按钮
添加导航按钮
在导航栏中你可以添加一些重要操作的按钮,它们会以图标或文本的形式显示.对于不能在导航栏中完全显示或不是很重要的操作按钮可以将其添加到隐藏的下拉菜单中.如图:
(1).通过XML定义操作按钮:
所有的操作按钮包括下拉菜单中的按钮选项都在一个XML的菜单资源文件中定义.在导航栏中添加按钮,首先在res/menu/路径下创建一个XML文件.
在文件中添加"<item>"元素,每一个"<item>"元素对应一个按钮.如下:
res/menu/main_activity_actions.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <!-- Search, should appear as action button --> <item android:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:title="@string/action_search" android:showAsAction="ifRoom" /> <!-- Settings, should always be in the overflow --> <item android:id="@+id/action_settings" android:title="@string/action_settings" android:showAsAction="never" /> </menu>
上面的配置表示将会在首页的导航栏中显示一个搜索按钮,设置按钮将会常驻下拉菜单中.(默认情况下,所有的按钮都包含在下拉菜单中,但最好是根据你的设计意图为每一个按钮指定行为)
"icon"属性需要设置一个资源ID来指定图片,"@drawable/"后面的名称必须是你在"res/drawable/"文件夹中
保存的图片名称.例如,"@drawable/ic_action_search"引用的是"ic_action_search.png"图片.同样的,"title"属性引用"res/values/"路径下的XML文件中的字符串资源.就像我们在"创建第一个android应用"课程中学习的字符串资源引用一样.
备注:当为你的程序创建图标和图片时,为不同分辨率的屏幕提供不同的图片版本是非常重要的.这有利于你的程序在不同的设备上都能按预想的结果运行.
如果你使用支持库使你的程序的兼容版本低到了Android2.1,那么"showAsAction"属性在"android"名称空间下是不可用的.你可以使用支持库提供的属性代替.你必须自定义命名空间,并将这个命名空间作为这个属性的前缀.(虽然允许你定义任何的命名空间,但是最好还是根据你的工程名称来定义.这个命名空间只在声明它的文件中有效.)
例如:
res/menu/main_activity_actions.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yourapp="http://schemas.android.com/apk/res-auto" > <!-- Search, should appear as action button --> <item android:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:title="@string/action_search" yourapp:showAsAction="ifRoom" /> ... </menu>
(2).将操作按钮添加到导航栏
通过实现"onCreateOptionsMenu()"回调函数,将菜单资源添加到"Menu"对象中,将按钮添加到导航栏中.如:
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu items for use in the action bar MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_activity_actions, menu); return super.onCreateOptionsMenu(menu); }
(3).响应按钮操作
当用户点击导航栏中的一个按钮或是下拉菜单中的选项时,系统会调用对应的Activity中的"onOptionsItemSelected()"方法.在这个方法的实现中调用"getItemId()"方法来确定哪个按钮被点击了.返回的ID值对应之前在"<item>"元素中声明的 "android:id"的值.代码如下:
@Override public boolean onOptionsItemSelected(MenuItem item) { // Handle presses on the action bar items switch (item.getItemId()) { case R.id.action_search: openSearch(); return true; case R.id.action_settings: openSettings(); return true; default: return super.onOptionsItemSelected(item); } }
(4).为活动页面添加返回按钮
在你的程序中,不是所有的活动页面都是首页.为了方便用户操作,应该为所有活动页面设置一个包含罗辑层次结构的返回按钮.
当运行Android4.1(API 16)及更高时,或通过Support Library使用"ActionBarActivity"时,只需要在"manifest"文件中为需要在导航栏中显示返回按钮的活动声明一个父活动即可.例如:
<application ... > ... <!-- The main/home activity (it has no parent activity) --> <activity android:name="com.example.myfirstapp.MainActivity" ...> ... </activity> <!-- A child of the main activity --> <activity android:name="com.example.myfirstapp.DisplayMessageActivity" android:label="@string/title_activity_display_message" android:parentActivityName="com.example.myfirstapp.MainActivity" > <!-- Parent activity meta-data to support 4.0 and lower --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> </application>
然后通过调用"setDisplayHomeAsUpEnable()"方法为返回按钮设置图标:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_displaymessage); getSupportActionBar().setDisplayHomeAsUpEnabled(true); // If your minSdkVersion is 11 or higher, instead use: // getActionBar().setDisplayHomeAsUpEnabled(true); }
因为设置了"DisplayMessageActivity"的父类为"MainActivity",当用户点击返回按钮时,系统就会自动导航到
它的父活动页面.你不需要为返回按钮注册监听事件.