[android](学习笔记7)为应用程序添加选项菜单

1 在xml文件中定义选项菜单:

  创建res/menu目录,并添加xml文件:选择New-Android XML File。选择Menu文件资源类型;

  打开新建的xml文件,切换到xml编辑视图,添加新的item元素:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/menu_item_new_crime"
        android:icon="@android:drawable/ic_menu_add"
        android:title="@string/new_crime"
        android:showAsAction="ifRoom|withText" />
</menu>

  为item新建资源id,在后面的响应代码中,会用到该id。showAsAction属性用于指定菜单项是显示在操作栏上,还是隐藏在溢出菜单中。选择ifRoom和withText组合值,表明如果空间足够,菜单项和文字标题都会显示,如果空间只够显示图标,则文字标题不会显示。如何访问溢出菜单,取决于具体设备。

2 创建选项菜单:

  在需要选项菜单时,Android会调用activity的onCreateOptionMenu方法。不过Fragment也有一套自己的选项菜单回调函数:

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
public boolean onOptionsItemSelected(MenuItem item)

  首先在Fragment类中覆盖onCreateOptionsMenu方法,通过参数inflater创建菜单:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // 该方法由托管activity的FragmentManager负责调用
    // TODO Auto-generated method stub
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.fragment_crime_list, menu);
}

  调用超类的onCreateOptionsMenu方法属于编程规范,尽管它内部什么也不做。为了告知托管activity的FragmentManager自己有选项菜单,需要调用setHasOptionsMenu方法:

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true); // onCreateOptionsMenu方法由托管activity的FragmentManager负责调用,
                             // 需要借助setHasOptionsMenu方法告知FragmentManager
    getActivity().setTitle(R.string.crimes_title);  // getActivity()返回托管activity
                                // CrimeListFragment要显示CrimeLab中的Crime列表,需要先获取CrimeLab单例对象,进而获取其中的列表
    mCrimes = CrimeLab.get(getActivity()).getCrimes();

    CrimeAdapter adapter = new CrimeAdapter(mCrimes);
    // listview <--> adapter <--> mCrimes
    setListAdapter(adapter); // 为CrimeListFragment内置ListView设置adapter
}

3 响应菜单选择:

  若要响应选项菜单的选择,需要覆盖onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // TODO Auto-generated method stub
    switch(item.getItemId()) {
    case R.id.menu_item_new_crime: {    // TODO: Add your code...    return true;
    }
    default:
        return super.onOptionsItemSelected(item);
    }
}

  其中,R.id.menu_item_new_crime就是一开始创建的选项菜单项的id,返回true表明已经处理完所有的响应任务,如果item不是自己关系的,可以走default分支,让超类来处理。

附加内容:

如何为应用程序添加层级式导航?

现在很多应用程序,都在选项菜单的地方有一个向上的层级导航按钮,下面给出最一般的实现思路。

1 启用应用图标向上导航按钮的功能:

  在Fragment.onCreateView方法调用setDisplayHomeAsUpEnable方法,设置fragment的属性。

@TargetApi(11)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
    // step4
    // TODO Auto-generated method stub
    View v = inflater.inflate(R.layout.fragment_crime, parent, false);
    // 启用向上导航按钮
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        if (NavUtils.getParentActivityName(getActivity()) != null) {
                getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
        }
}

  这时,应用程序图标上会显示向左的图标,但点击该按钮,无响应。

2 响应向上按钮:

  覆盖Fragment.onOptionsItemSelected方法:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home: {
        if (NavUtils.getParentActivityName(getActivity()) != null) { // 首先判断是否有父activity,有则完成跳转,这种父子关系通过Manifest注册
          NavUtils.navigateUpFromSameTask(getActivity());
        }
        return true;
    }
    default: {
        return super.onOptionsItemSelected(item);
    }
    }
}

  这里借助的是NavUtils类完成从一个activity跳转到另一个activity的导航功能。这种源到目的的关系是通过Manifest文件来注册的,例如,从Activity_A跳转到Activity_B,可以在Manifest中注册:

<activity android:name=".Activity_A"
      android:label="@string/app_name" >
          <meta-data android:name="android.support.PARENT_ACTIVITY"
            android:value=".Activity_B"/>
</activity>
时间: 2024-10-18 05:45:48

[android](学习笔记7)为应用程序添加选项菜单的相关文章

Android学习笔记(十四)——在运行时添加碎片(附源码)

在运行时添加碎片 点击获取源码 将UI分割为多个可配置的部分是碎片的优势之一,但其真正强大之处在于可在运行时动态地把它们添加到活动中. 1.使用上一篇创建的Fragments项目,在main.xml文件中注释掉两个<fragment>元素: 2.在FragmentActivity.java中添加下面的代码: FragmentManager fragmentManager = getSupportFragmentManager();//向活动添加碎片 FragmentTransaction fr

Android学习笔记(十七)——使用意图调用内置应用程序

使用意图调用内置应用程序 1.创建一个新的Android项目并命名为Intents,在main.xml文件中添加两个Button: <Button android:id="@+id/btn_webbrowser" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="onClickWebBrowser&quo

Android学习笔记四:添加Source

问题描述 Source not foundThe JAR file D:\.....\sdk\platforms\android-20\android.jar has no source attachment. 问题原因及解决办法 1. 使用SDK Manager下载最新版本的Sources for Android SDK 一般文件下载目录默认在SDK下的sources文件中即 \adt-bundle-windows-x86_64-20130522\sdk\sources\android-20

Android学习笔记——关于onConfigurationChanged

从事Android开发,免不了会在应用里嵌入一些广告SDK,在嵌入了众多SDK后,发现几乎每个要求在AndroidManifest.xml申明Activity的广告SDK都会要求加上注明这么一句属性: android:configChanges="orientation|keyboard|keyboardHidden" 通过查阅Android API可以得知android:onConfigurationChanged实际对应的是Activity里的onConfigurationChan

Android学习笔记_78_ Android开发中使用软引用和弱引用防止内存溢出

在<Effective Java 2nd Edition>中,第6条"消除过期的对象引用"提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象池.缓存中的过期对象都有可能引发内存泄露的问题.书中还提到可以用 WeakHashMap来作为缓存的容器可以有效解决这一问题.之前也确实遇到过类似问题,但是没有接触过"弱引用"相关的问题,于是查阅了一些资料. <Java 理论与实践: 用弱引用堵住内存泄漏>

Android学习笔记(十五)——碎片的生命周期(附源码)

碎片的生命周期 点击下载源码 与活动类似,碎片具有自己的生命周期.理解了碎片的生命周期后,我们可以在碎片被销毁时正确地保存其实例,在碎片被重建时将其还原到前一个状态. 1.使用上一篇的项目Fragments,在Fragment1.java文件中添加如下代码: package net.zenail.Fragments; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragm

Android学习笔记(四二):SQLite、ListView、ContextMenu

继续上一个例子,结合ListView中对SQLite进行操作. 通过CursorAdapter在ListView中的数据呈现 在上一个例子中,我们可以对SQLite中的数据库进行增删改查,将数据读到游标Cursor中,然后一一读出.在Android中可以通过CursorAdapter直接将数据映射到ListView中,如下处理: public class Chapter22Test1 extends ListActivity{    private SQLiteDatabase  db = nu

Android学习笔记(十六)——碎片之间进行交互(附源码)

碎片之间进行交互 点击下载源码 很多时候,一个活动中包含一个或者多个碎片,它们彼此协作,向用户展示一个一致的UI.在这种情况下,碎片之间能进行通信并交换数据十分重要. 1.使用上一篇中创建的同一个项目,在fragment.xml中添加TextView的标识id: android:id="@+id/lblFragment1" 2.在fragment2.xml中添加一个Button,用于与fragment1进行交互: <Button android:id="@+id/btn

九、Android学习笔记_ Android开发中使用软引用和弱引用防止内存溢出

在<Effective Java 2nd Edition>中,第6条"消除过期的对象引用"提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象池.缓存中的过期对象都有可能引发内存泄露的问题.书中还提到可以用 WeakHashMap来作为缓存的容器可以有效解决这一问题.之前也确实遇到过类似问题,但是没有接触过"弱引用"相关的问题,于是查阅了一些资料. <Java 理论与实践: 用弱引用堵住内存泄漏>