【问题标题】:Implementing option menu one time for several activities为多项活动一次性实施选项菜单
【发布时间】:2012-04-03 15:03:54
【问题描述】:

我正在尝试为我的应用程序实现一个选项菜单,并且在不同的活动中使用相同的菜单。在Android developers site 中,它说:

提示:如果您的应用程序包含多个活动,其中一些活动 提供相同的选项菜单,考虑创建一个活动 除了 onCreateOptionsMenu() 和 onOptionsItemSelected() 方法。然后为每个扩展这个类 应该共享相同选项菜单的活动。这样,您可以 管理一组用于处理菜单操作和每个后代的代码 类继承菜单行为。如果要添加菜单项 后代活动之一,覆盖 onCreateOptionsMenu() 那个活动。调用 super.onCreateOptionsMenu(menu) 使原来的 创建菜单项,然后使用 menu.add() 添加新的菜单项。你 还可以覆盖单个菜单的超类行为 项目。

我的活动从 Activity、ListActivity 或 MapActivity 扩展而来,那么在此处实施他们所建议的内容的正确方法是什么?可能吗?因为我无法为所有这些扩展这个新类,我只能做一些类似 public abstract BaseMenu extends Activity 的事情(如this question 中所述),但这对我不起作用。所以我想知道是否有可以解决的方法。

提前致谢

【问题讨论】:

    标签: java android


    【解决方案1】:

    对于那个通用的基本菜单类,您需要扩展 MapActivity 类。因此,您可以为所有活动扩展该通用基本菜单类。

    对于那个ListActivity你也可以不使用ListActivity来实现列表,你可以只用Activity或者MapActivity来实现。

    你必须在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 中不需要 Map,使用 MapActivity 代替 Activity 是否是一种好方法。我认为它会消耗更多内存。
    • 据我所知,如果没有地图活动,地图就无法实现,因此对于常见的基本菜单选项,这是合适的方式。
    【解决方案2】:

    如果不扩展 mapactivity 类,你就不能使用 mapview.. 参考这个.. MapView without MapActivity ..所以你应该让你的基类扩展地图活动......以及使用listview的活动......将listview放在xml中,你可以在你的活动中使用它......

    【讨论】:

      【解决方案3】:

      我将创建一个静态 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中编程那么多。
      • onCreateOptionMenu 和 onOptionItemsSelected 的实现实现了一些类似 Intents 的东西。我已经从 Activity 扩展了 MenuProvider,但是它给我这些方法上的修饰符 static 抛出了一个错误。
      猜你喜欢
      • 2011-10-24
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多