私のアプリケーションでは、アプリケーションの状態を反映するようにオプション メニューを管理しています。3 つのメニューが可能です。
このonCreateOptionsMenu
関数では、XML ファイルから基本的なエントリを膨らませます。
このonPrepareOptionsMenu
関数では、メニューをクリアしてから、アプリケーションの現在の状態に対応する XML ファイルをインフレートします。
そして、これは予期しない結果につながります!!!
メニューを状態 1 から状態 2 に変更してから状態 1 に戻すと、「その他」エントリがメニューのエントリの 1 つに視覚的に置き換えられます。しかし、機能は正しいです。クリックすると、オーバーフロー メニューが表示されます。
そして、状態 3 に変更すると、開こうとしてもメニューが表示されません。コードをデバッグすると、メニューがインフレーションの結果で正しく埋められていることがわかります (それに応じてメニューのサイズが変わります)。
コードが Android 2.3.3 で完全に動作することを付け加えておきます。この問題は、Android 4 で実行した場合にのみ発生します (Android 3 ではテストされていません)。
何か案が?
ご要望に応じて、問題を確認できるようにコードを簡略化しました。アプリケーションのコードは次のとおりです。
public class MainActivity extends Activity{
private boolean m2=false,m3=false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflateur;
inflateur = getMenuInflater();
inflateur.inflate(R.menu.menu_1,menu);
return (true);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuInflater inflateur;
inflateur = getMenuInflater();
menu.clear();
if (m2){
inflateur.inflate(R.menu.menu_2,menu);
} else {
if(m3) {
inflateur.inflate(R.menu.menu_3, menu);
} else {
inflateur.inflate(R.menu.menu_1, menu);
}
}
return (true);
}
@Override
public boolean onOptionsItemSelected(MenuItem entréeMenu) {
switch (entréeMenu.getItemId()) {
case R.menu.m1_4: {
return true;
}
case R.menu.m1_5: {
return true;
}
case R.menu.m1_7: {
return true;
}
case R.menu.m1_8: {
return true;
}
case R.menu.m1_10: {
return true;
}
case R.menu.m1_12: {
return (true);
}
case R.menu.m1_13: {
return (true);
}
case R.menu.m1_1: {
return true;
}
case R.menu.m1_11: {
// change for menu_2
m2=true;
m3=false;
return true;
}
case R.menu.m3_1: {
return true;
}
case R.menu.m3_2: {
return true;
}
case R.menu.m2_1: {
// revert to menu_1
m2=false;
return true;
}
case R.menu.m2_2: {
return true;
}
case R.menu.m1_2: {
// change for menu_3
m2=false;
m3=true;
return true;
}
case R.menu.m1_3: {
return true;
}
case R.menu.m3_3: {
// revert to menu_1
m3=false;
return true;
}
case R.menu.m2_5: {
return true;
}
case R.menu.m2_3: {
return true;
}
case R.menu.m2_4: {
return true;
}
case R.menu.m1_6: {
return (true);
}
case R.menu.Options: {
return (true);
}
case R.menu.m1_14:{
return(true);
}
default: {
return super.onOptionsItemSelected(entréeMenu);
}
}
}
}
アクティブなメニュー エントリは 4 つだけです。1.11 では menu_1 から menu_2 に変更され、2.1 では menu_1 に戻ります。1.2 は menu_1 から menu_3 に変更され、3.3 は menu_1 に戻ります。
これまでに発生した問題: 1) 1.11 をクリックして menu_2 に変更します。メニューを開く : 5 つのメニュー項目のみが表示されます。メニューを閉じて再度開くと、6 つのメニュー項目が正しく表示されるようになりました。2) 2.1 をクリックしてメニュー 1 に戻ります。6 番目の位置に、「詳細」ではなく「2.6」が表示されます。「2.6」をクリックすると、動作は「詳細」のクリックに対応します。
そして今、メニュー用の XML ファイル: menu_1 :
<?xml version="1.0" encoding="UTF-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+menu/m1_1"
android:title="1.1">
</item>
<item android:id="@+menu/m1_2"
android:title="1.2">
</item>
<item android:id="@+menu/m1_3"
android:title="1.3">
</item>
<item android:id="@+menu/m1_4"
android:title="1.4">
</item>
<item android:id="@+menu/m1_5"
android:title="1.5"
android:checkable="true">
</item>
<item android:id="@+menu/m1_6"
android:title="1.6"
android:checkable="true">
</item>
<item android:id="@+menu/m1_7"
android:title="1.7"
android:checkable="true">
</item>
<item android:id="@+menu/m1_8"
android:title="1.8"
android:checkable="true">
</item>
<item android:id="@+menu/m1_9"
android:title="1.9"
android:enabled="false"
android:visible="false"
android:checkable="true">
</item>
<item android:id="@+menu/m1_10"
android:title="1.10">
</item>
<item android:id="@+menu/m1_11"
android:title="1.11">
</item>
<item android:id="@+menu/m1_12"
android:title="1.12">
</item>
<item android:id="@+menu/m1_13"
android:title="1.13">
</item>
<item android:id="@+menu/m1_14"
android:title="1.14">
</item>
<item android:id="@+menu/Options"
android:title="1.15">
</item>
メニュー_2:
<item android:id="@+menu/m2_2"
android:title="2.2">
</item>
<item android:id="@+menu/m2_3"
android:title="2.3">
</item>
<item android:id="@+menu/m2_4"
android:title="2.4">
</item>
<item android:id="@+menu/m2_5"
android:title="2.5">
</item>
<item android:id="@+menu/Options"
android:title="2.6">
</item>
</menu>
および menu_3 :
<?xml version="1.0" encoding="UTF-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+menu/m3_1"
android:title="3.1">
</item>
<item android:id="@+menu/m3_2"
android:title="3.2">
</item>
<item android:id="@+menu/m3_3"
android:title="3.3">
</item>
<item android:id="@+menu/m1_4"
android:title="3.4">
</item>
<item android:id="@+menu/Options"
android:title="3.5">
</item>
</menu>