我的应用程序有3种不同的风格,full
,part1
和part2
。
所有不同的口味都有不同的包名,因此我可以将它们作为不同的应用程序发送。
现在我希望只有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
很明显为什么会这样。但是你有什么建议解决方案是为不同的构建风格定制菜单吗?
答案 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
}
}