1

私は3種類のフレーバー、full,part1およびpart2を持つアプリを持っています。Flavorのメニュー項目を非表示にする方法

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

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

私は、メニューリソースと次のことを試してみました:part1ためmain_activity.xmlがある

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

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"> 
    <item 
     android:id="@+id/action_reload" 
     android:icon="@drawable/ic_reload" 
     android:title="@string/action_reload" 
     app:showAsAction="always"/> 
</menu> 

そしてmain_activity.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"> 
</menu> 

、I場合アポを作るpart1以外のビルドバリアントのp、私はメニュー選択に反応する必要が私の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); 
    } 
} 

つまり、なぜそれは非常に明白です。しかし、異なるビルドの味のためにメニューをカスタマイズするという解決策は何か提案はありますか?

+1

あなたは可能性がありあなたは 'onOptionsItemSelected'の別のバージョンを提供する、フレーバー毎に共通のコードと異なるMainActivityとBaseActivityを持っています – Blackbelt

答えて

1

通常の共通コードを処理するメインソースフォルダにMainActivityを作成します。別のMainActivityをpart1ソースフォルダに作成して、onOptionsItemSelectedを上書きします。R.id.action_reloadへの参照は問題ありません。それはうまくいくはずです。

0

あなたはヘルパーでonOptionsItemSelected(MenuItem item)方法の内容を定義し、味が必要なヘルパーをロード使用することができます

@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 
    } 
} 
1

ます。また、メニューフォルダ内の別のXMLファイルを作成し、内部の同じリソースIDを作成することができますたとえば、次のようになります。

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

次に、同じIDを持つアイテムを作成します。それは決して膨らまされなかったので、決して選択されないので、あなたはそれを使用しません。

+0

...これは悪くないnswerも。私がコメントした2つの答えは、受け入れられた答えよりも優れています – SimonH

+0

私は最近、同じ問題を解決する可能性のある別の答えを読んでいます:ids.xmlファイルを値フォルダに追加すると、idだけを宣言できます。私が前に述べたように、実際にはそれを使うことはありません。 – Omaraf

6

あなたは、全体のクラスファイルをコピーする必要はありませんが、これを行う、その後の風味または味の設定を検出し、それを調整した場合:設定フィールドを作成Gradleのファイルで

を:

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

その後、gradleを構築します。あなたはこのように活動して、この設定フィールドにアクセスすることができます。

@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

私の謙虚な意見ではこれははるかに良い答えです。 MainActivityの異なるバージョンを使用するよりも、すべてのメニューオプションを作成してから、必要なものを削除するほうが簡単です。 – SimonH

2

別の方法があります - それぞれの風味などのために別の値で、ブーリアンリソースと値ファイルを作成します。

メイン/RES /値/ブール。XML:

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

パート1 /res/values/bool.xml:あなたのメニューreourceで

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

して、リソースに依存視界値を設定します。

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