6

fullと の 3 つの異なるフレーバーを持つアプリがpart1ありpart2ます。

フレーバーごとにパッケージ名が異なるため、異なるアプリとして出荷できます。

part1というメニュー項目だけを取得したいのですReload。他の 2 つのフレーバーには、このメニュー項目はありません。これは可能ですか?

メニューリソースで次のことを試しました:

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

forは次のとおり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>

そして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コンパイル エラーが発生します。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);
    }
}

その理由は明らかです。しかし、さまざまなビルド フレーバーに合わせてメニューをカスタマイズするための解決策について何か提案はありますか?

4

5 に答える 5

12

別の方法があります-ブールリソースで値ファイルを作成し、フレーバーごとに異なる値を作成します。

メイン/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>
于 2017-10-18T07:12:41.720 に答える
11

クラスファイル全体をコピーするのではなく、フレーバーまたはフレーバーの設定を検出して調整する場合は、次のようにします。

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);
}

同様ですが、私の意見では、より良いアプローチは resValue を使用することです。最初にそれを gradle ファイルに作成します。

defaultConfig {
    ...
    resValue "bool", "show_my_menu_item", "true"
}
productFlavours {
    FooFlavour {
        ...
        resValue "bool", "show_my_menu_item", "false"
    }
}

この後、resValue は menu.xml で直接アクセスできます。

<?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:visible="@bool/show_my_menu_item" />
</menu>
于 2016-12-13T15:46:27.703 に答える
2

メニュー フォルダーに別の xml ファイルを作成し、その中に同じリソース ID を作成することもできます。次に例を示します。

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

次に、ダミー メニューで同じ ID のアイテムを作成します。膨張したことがないため、選択されないため、使用しません。

于 2016-06-13T03:52:59.720 に答える
1

MainActivity通常の共通コードを処理するメイン ソース フォルダーに を作成します。への参照が問題にならないMainActivity場所をオーバーライドする part1 ソース フォルダーに別のフォルダーを作成します。それはうまくいくはずです。onOptionsItemSelectedR.id.action_reload

于 2016-04-12T09:34:55.787 に答える