如何隐藏或添加Flavor的菜单项?

时间:2016-04-12 09:29:42

标签: android android-menu android-build-flavors android-flavors

我的应用程序有3种不同的风格,fullpart1part2

所有不同的口味都有不同的包名,因此我可以将它们作为不同的应用程序发送。

现在我希望只有part1才能获得名为Reload的菜单项。其他两种口味不应该有这个菜单项。这可能吗?

我尝试了以下菜单资源:

app
|
+-src
  |
  +-full
  |
  +-main
  | |
  | +-res
  |   |
  |   +-menu
  |     |
  |     +-main_activity.xml
  |
  +-part1
  | |
  | +-res
  |   |
  |   +-menu
  |     |
  |     +-main_activity.xml
  |
  +-part2

main_activity.xml的{​​{1}}位于:

part1

<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_reload" android:icon="@drawable/ic_reload" android:title="@string/action_reload" app:showAsAction="always"/> </menu> 的{​​{1}}是:

main_activity.xml

但是,如果我在main以外的任何其他构建版本中构建应用程序,我的<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> </menu> 中会出现编译错误,我需要对菜单选择作出反应:

part1

很明显为什么会这样。但是你有什么建议解决方案是为不同的构建风格定制菜单吗?

5 个答案:

答案 0 :(得分:7)

如果您不想复制整个类文件,但要检测任何风味的味道或设置并进行调整,请执行以下操作:

在gradle文件中创建配置字段:

defaultConfig {
    ...
    buildConfigField "boolean", "SHOW_MY_MENU_ITEM", "true"
}
productFlavors {
    FooFlavour {
        ...
        buildConfigField "boolean", "SHOW_MY_MENU_ITEM", "false"
    }
}

然后建立gradle。您可以在Activity中访问此配置字段,如下所示:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.foo_menu, menu);
    if (!BuildConfig.SHOW_MY_MENU_ITEM) {
        MenuItem myItem = menu.findItem(R.id.my_menu_item);
        myItem.setVisible(false);
    }
    return super.onCreateOptionsMenu(menu);
}

答案 1 :(得分:7)

还有另一种方法 - 使用布尔资源创建值文件,每种风格的值都不同,例如:

main /res/values/bool.xml:

 <resources>
        <bool name="show_reload">false</bool>
    </resources>

part1 /res/values/bool.xml:

    <?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="show_reload">true</bool>
</resources>

然后在菜单资源中设置可见性值取决于资源:

<menu ..>
    <item ..
      android:visible="@bool/show_reload"
      ..
    />
</menu>

答案 2 :(得分:1)

在主源文件夹中创建一个MainActivity,用于处理普通公共代码。在part1源文件夹中创建另一个MainActivity,覆盖onOptionsItemSelected,以便R.id.action_reload引用它并不成问题。这应该有用。

答案 3 :(得分:1)

您还可以在菜单文件夹中创建另一个xml文件,并在其中创建相同的资源ID,例如:

app
|
+-src
  |
  +-full
  |
  +-main
  | |
  | +-res
  |   |
  |   +-menu
  |     |
  |     +-main_activity.xml
  |     +-dummy_menus.xml

然后在虚拟菜单中创建一个具有相同ID的项目。你只是不会使用它,因为它永远不会被选中,因为它永远不会被夸大。

答案 4 :(得分:0)

您可以在帮助程序中定义onOptionsItemSelected(MenuItem item)方法的内容,然后使用flavor加载所需的帮助程序:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    HelperPart.selectItem(this, item);
}


// Helper loaded for flavor "part1"
static class MenuHelper{ 
    public static boolean selectItem(Activity act, MenuItem item){
        switch (item.getItemId()) {
            case R.id.action_reload: 
                // TODO reload
                return true;
            default:
                return act.onOptionsItemSelected(item);
        }
    }
}

// Helper loaded for flavor "part2" and "full"
static class MenuHelper{
    public static boolean selectItem(Activity act, MenuItem item){
        // Do nothing
    }
}