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

Ter*_*rry 3 android android-menu android-build-flavors android-flavors

我有一个有3种不同口味的应用程序full,part1part2.

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

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

我尝试了以下菜单资源:

app
|
+-src
  |
  +-full
  |
  +-main
  | |
  | +-res
  |   |
  |   +-menu
  |     |
  |     +-main_activity.xml
  |
  +-part1
  | |
  | +-res
  |   |
  |   +-menu
  |     |
  |     +-main_activity.xml
  |
  +-part2
Run Code Online (Sandbox Code Playgroud)

其中main_activity.xmlpart1是:

<?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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

但是,如果我在任何其他构建版本中构建应用程序part1,我会MainActivity在我需要对菜单选择做出反应的地方出现编译错误:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_reload: // Compile error: This item is not available
            // TODO reload
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

小智 9

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

main /res/values/bool.xml:

 <resources>
        <bool name="show_reload">false</bool>
    </resources>
Run Code Online (Sandbox Code Playgroud)

part1 /res/values/bool.xml:

    <?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="show_reload">true</bool>
</resources>
Run Code Online (Sandbox Code Playgroud)

然后在菜单reource中设置依赖于资源的可见性值:

<menu ..>
    <item ..
      android:visible="@bool/show_reload"
      ..
    />
</menu>
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的解决方案 (2认同)

Dar*_*iak 7

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

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

defaultConfig {
    ...
    buildConfigField "boolean", "SHOW_MY_MENU_ITEM", "true"
}
productFlavors {
    FooFlavour {
        ...
        buildConfigField "boolean", "SHOW_MY_MENU_ITEM", "false"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后建立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);
}
Run Code Online (Sandbox Code Playgroud)


Joa*_*usa 1

MainActivity在处理普通通用代码的主源文件夹中创建一个。MainActivity在第 1 部分源文件夹中创建另一个文件夹,您onOptionsItemSelected可以在其中覆盖引用R.id.action_reload. 那应该有效。