【问题标题】:Same option menu in all Activities in AndroidAndroid中所有活动中的相同选项菜单
【发布时间】:2011-03-17 06:14:18
【问题描述】:

我的项目中有 10-15 项活动。我希望在所有活动中都有选项菜单。那么他们是否有任何方式我们可以在一个地方做到这一点,并且它出现在所有活动中。

另外,我想隐藏一些选项菜单。那么,是否有可能或者我必须在所有活动中编写选项菜单代码。

问候

苏尼尔

【问题讨论】:

  • st0le 的回答完美。我唯一的建议是,在你不想要菜单的活动中,不要从BaseActivity类继承,而是从Activity继承。这样你就不必重写菜单相关的方法了。

标签: android menu option


【解决方案1】:

创建一个扩展 Activity 的类(比如 BaseActivity),并覆盖 onCreateOptionsMenuonOptionsItemSelected 函数。

public class BaseActivity extends Activity {

    // Activity code here

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item:
                // do what you want here
                return true;
            default:
               return super.onOptionsItemSelected(item);
        }
    }
}

现在,在其他 15-16 个活动中,您应该扩展 BaseActivity,而不是扩展 Activity。

public class FooActivity extends BaseActivity { 

    // Activity code here

}

这样,您的所有活动都会派生选项菜单。对于您希望禁用选项菜单的活动,您可以在该特定活动中再次覆盖它。

public class BarActivity extends BaseActivity { 

    // Activity code here

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
       // Do Nothing
   }

   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
       // Do Nothing
   }
}

希望它不会在清单文件中给您带来问题。

【讨论】:

  • 即使我想到了这一点,但我已经有了一个自定义活动,用于在所有活动中设置标题栏。将尝试在其中实现它。
  • 是的,请这样做,它应该可以工作。同时报告你的结果。 :)
  • 除非您使用 ListActivity 之类的东西或其他从 Activity 派生的东西,否则它将起作用。在这种情况下,您必须从 BaseActivity 派生自己的 ListActivities。
  • 为我工作!尽管确实存在仅扩展 1 个类的限制。
  • BaseMenu 是一个类还是一个活动?
【解决方案2】:

解决这个问题的方法是在你的新活动中添加这个菜单方法。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_home_page, menu);
    menu.removeItem(R.id.logout);
    return true;
}

在每个活动中,此方法将自动出现。

如果没有,则使用 inflate 调用添加它。它需要两个参数,一个 xml 资源(与您在原始活动中使用的相同),以及传递给 onCreateOptionsMenu 方法的菜单对象。

menu.removeItem 将删除您传递给它的任何资源 ID 的菜单项。 我希望这可以帮助那些面临这个问题的人。

谢谢你,很高兴分享这篇文章。

【讨论】:

    【解决方案3】:

    仅扩展BaseActivity 是不够的,您还必须在其他活动中像这样调用super.onCreateOptionsMenu(menu)super.onOptionsItemSelected(item)

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        //getMenuInflater().inflate(R.menu.menu_second, menu);  <- remove this
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return super.onOptionsItemSelected(item);
    }
    

    【讨论】:

    • getMenuInflater().inflate(R.menu.menu_second, menu); //
    • 这会让optionMenu消失...?
    猜你喜欢
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2012-07-20
    • 2012-03-08
    • 2016-04-19
    • 2014-10-03
    相关资源
    最近更新 更多