【问题标题】:Android: How to have a shared menu in each (List) Activity without re-writing the overridden methods?Android:如何在不重写重写方法的情况下在每个(列表)活动中拥有一个共享菜单?
【发布时间】:2010-01-05 14:04:18
【问题描述】:

我知道 Android 提供了一些有用的方法来覆盖以定义菜单:

    @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  menu.add(0, AIS, 0, "Activity Inventory Sheet").setIcon(android.R.drawable.ic_menu_upload);
                // ...
  return true;
 }

 public boolean onOptionsItemSelected(MenuItem item) {
  Intent i;
     switch (item.getItemId()) {
     case AIS: i = new Intent(this, ActivityInventorySheet.class);
      startActivity(i);
               return true;
     // ...
     }
     return false;
 }

我希望我的 Android 应用程序的每个 Activity 和 ListActivity 共享此菜单。这是为了在每个(列表)Activity 中都有一个标准菜单,让用户可以通过单击跳转到应用程序的每个部分。

目前,实现这一点的最简单方法是在应用程序的每个(列表)活动中复制并粘贴这两种方法。我不喜欢这种冗余的代码编写:)

子类化是一个合理的选择吗?我已经看到,对我的 ListActivity 之一进行子类化并不能很好地工作(从数据库中检索对象的线程会出现问题)。 还有其他方法可以通过活动共享菜单吗?

谢谢

【问题讨论】:

    标签: android menu android-activity listactivity


    【解决方案1】:

    我使用带有静态方法的助手类来初始化和处理常用菜单选项,然后每个 Activity 定义自己的 onCreateOptionsMenu 等,将常见任务委托给助手类,并且可以添加更多特定于该 Activity 的菜单项。

    类似

    class SharedMenu {
        public static void onCreateOptionsMenu(Menu menu) {
            menu.add(...);
            menu.add(...);
        }
    }
    
    public class MyActivity extends Activity {
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            super.onCreateOptionsMenu(menu);
            menu.add(...);  // specific to this activity
            SharedMenu.onCreateOptionsMenu(menu);
            return true;
        }
    
    }
    

    onMenuItemSelected 等提供更多方法。

    编辑:我没有使用公共基类,因为我需要其中两个开始,一个用于活动,另一个用于列表活动,然后在我的情况下,我需要在一些上添加自定义菜单选项活动。

    【讨论】:

    • 这也是一个很好的答案,尤其是当您需要扩充自定义菜单选项时
    • @DanielYankowsky 为什么在这种情况下最好避免子类化?
    • @Josh Pinter 在我看来,在 Java、C# 等单继承语言中,除非绝对必要或非常方便,否则最好避免子类化。你只得到一个基类,所以你想竭尽全力避免用完它。这是不需要子类化的情况,并且替代方案非常易读。我相信这里提供的解决方案是一个非常好的解决方案。
    【解决方案2】:

    我认为这没有理由不能完美运行:

    public abstract class MyListActivity extends ListActivity
    {
       @Override
       public boolean onCreateOptionsMenu(Menu menu) {
          menu.add(0, AIS, 0, "Activity Inventory Sheet").setIcon(android.R.drawable.ic_menu_upload);
          // ...
          return true;
       }
    
       @Override
       public boolean onOptionsItemSelected(MenuItem item) {
          Intent i;
          switch (item.getItemId()) {
              case AIS: i = new Intent(this, ActivityInventorySheet.class);
              startActivity(i);
              return true;
              // ...
          }
          return false;
       }    
    }
    

    然后让您的活动扩展 MyListActivity 而不是 ListActivity。

    我已经看到了子分类 我的 ListActivity 之一不起作用 非常好(检索线程 来自数据库的对象正在给出 问题)。

    这听起来像是一个完全不同的问题。您可能想就此发表一个单独的问题。简单地在 Java 中扩展一个类不会产生像您所描述的那样的任何问题。

    【讨论】:

    • 这很好用。我必须创建两个抽象类,一个用于活动,另一个用于 ListActivities(否则您提供的示例不适用于简单的活动)。无论如何,这要编写的代码要少得多,并且适合我的需要。谢谢!
    • 如果你有一个扩展ListActivity的Activity,你的布局中需要一个ListView,否则它会崩溃...
    【解决方案3】:

    我刚刚向GreenDroid 添加了一项功能来管理它。可能很有用,看看吧。 稍后我会尝试发布一个示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 2022-01-08
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      相关资源
      最近更新 更多