为多个活动实现一次选项菜单

5
我正在尝试为我的应用实现一个选项菜单,而且这个菜单在不同的活动中使用。在 Android 开发者网站 中有以下说明:
提示:如果你的应用包含多个活动,并且其中一些提供相同的选项菜单,请考虑创建一个什么也不实现只包含 onCreateOptionsMenu() 和 onOptionsItemSelected() 方法的活动。然后为每个共享相同选项菜单的活动扩展此类。这样,您可以管理处理菜单操作的一组代码,并且每个下属类都继承菜单行为。如果要向其中一个下级活动添加菜单项,请在该活动中重写 onCreateOptionsMenu()。调用 super.onCreateOptionsMenu(menu) 以创建原始菜单项,然后使用 menu.add() 添加新菜单项。您还可以针对各个菜单项覆盖超类的行为。
我的活动从 Activity、ListActivity 或 MapActivity 扩展,那么如何正确地实现他们所建议的内容呢?这是可能的吗?因为我不能为所有这些活动扩展这个新类,我只能像在这个问题中解释的那样做一些类似于 public abstract BaseMenu extends Activity 的事情,但这对我不起作用。所以我想知道是否有一种方法可以实现,谢谢您的帮助!
3个回答

2

对于通用的基础菜单类,您需要扩展MapActivity类。这样,您可以为所有活动扩展该通用的基础菜单类。

对于ListActivity,您也可以通过Activity或者MapActivity来实现列表,而无需使用ListActivity。

您需要在xml文件中声明您的listview并赋予以下id。

 <ListView
            android:id="@+id/listView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"/>

然后你需要在你的活动类中声明它。
ListView listView = (ListView)findViewById(R.id.listView);
listView.setAdapter(your adapter);

就像上面所说的,您可以不使用ListActivity来实现它。


如果某个Activity不需要地图,使用MapActivity而不是Activity是一个好的方式吗?我认为这将消耗更多的内存。 - Saurabh Pareek
1
据我所知,如果没有地图活动,地图无法实现,因此对于常见的基础菜单选项,这是合适的方式。 - Chirag

1

如果不扩展MapActivity类,就不能使用MapView...请参考没有MapActivity的MapView..所以你应该让你的基类扩展MapActivity...对于使用ListView的活动,请将ListView放在XML中,然后可以在活动中使用它。


0
我会创建一个静态的MenuProvider类,它实现了你的onCreateOptionsMenu()和onOptionItemsSelected()方法,静态地从活动的onCreateOptionsMenu()和onOptionsItemsSelected()中调用,如下所示:
public static class MenuProvider {

    // You can pass it the activity and other variables used by this method if 
    //   you need to.
    // Since the implementation is the same across all activities, they should
    //   pass the same variables. 
    public static void onCreateOptionsMenu(MenuItem item, Activity callingActivity, ...)  
       ... // Do stuff on create
    }

    public static void onOptionItemsSelected(MenuItem item, Activity callingActivity, ...)  
       ... // Do stuff on item select
    }
}

在您的每个活动中,您都会执行以下操作:

public class MyMapActivity extends MapActivity {
    ...

    public void onCreateOptionsMenu(MenuItem item)  
       MenuProvider.onCreateOptionsMenu(item, this, ... /*other variables */);
    }

    public static void onOptionItemsSelected(MenuItem item)  
       MenuProvider.onOptionItemsSelected(item, this, ... /*other variables */);
    }

    ...
}

谢谢,我不知道为什么以前没想到这个 :) 也许它不像其他建议的实现那样优雅,但我认为它更容易和更简洁,因为我没有在Android上编程那么久。 - marimaf
onCreateOptionMenu和onOptionItemsSelected的实现例如使用Intents等。我已经从Activity扩展了MenuProvider,但是这些方法上的static修饰符会抛出错误。 - marimaf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接