Ter*_*rry 3 android android-menu android-build-flavors android-flavors
我有一个有3种不同口味的应用程序full,part1和part2.
所有不同的口味都有不同的包名,所以我可以将它们作为不同的应用程序发送.
现在我希望只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.xml的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>
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)
如果您不想复制整个类文件,但要检测任何风味的味道或设置并调整它,请执行以下操作:
在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)
MainActivity在处理普通通用代码的主源文件夹中创建一个。MainActivity在第 1 部分源文件夹中创建另一个文件夹,您onOptionsItemSelected可以在其中覆盖引用R.id.action_reload. 那应该有效。
| 归档时间: |
|
| 查看次数: |
1298 次 |
| 最近记录: |