チェックされたコンテキストメニュー項目はチェックされたままではありません
-
11-10-2019 - |
質問
私はこのフォーラムとAndroid開発自体に慣れていないので、私の質問はおそらく非常に愚かなものになるでしょう。これについてお詫び申し上げます。 Developer.android.comの開発ガイドを読み始めました。コンテキストメニューのある部分がすべてうまく機能しました。今、私はいくつかのチェック可能なアイテムを含むサブメニューを備えたコンテキストメニューを用意しようとしました。そこで、submenuとアイテムをmenu.xmlに追加し、いくつかのitem.setchecked(true)メソッドをoncontextItemselected(...)メソッドに追加しました。
menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/info"
android:title="@string/info" />
<item android:title="@string/change">
<menu>
<item android:id="@+id/checkable_item1"
android:checked="true"
android:checkable="true"
android:title="@string/hello"/>
<item android:id="@+id/checkable_item2"
android:checkable="true"
android:title="@string/moin"/>
<item android:id="@+id/checkable_item3"
android:checkable="true"
android:title="@string/aloha"/>
</menu>
</item>
</menu>
.javaファイルの一部
...
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo)
{
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater1 = getMenuInflater();
inflater1.inflate(R.menu.context_menu, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item)
{
switch(item.getItemId())
{
case R.id.checkable_item1:
if(item.isChecked()) item.setChecked(false);
else item.setChecked(true);
return true;
case R.id.checkable_item2:
if(item.isChecked()) item.setChecked(false);
else item.setChecked(true);
return true;
case R.id.checkable_item3:
if(item.isChecked()) item.setChecked(false);
else item.setChecked(true);
return true;
default:
return super.onContextItemSelected(item);
}
}
...
問題は、メニューを開いてチェック可能なアイテムの1つを押すと、コンテキストメニューが閉じる直前に緑色のティックが小さなボックスにポップアップすることがわかりますが、メニューを再び開くと、ティックがなくなりました。今、私はなぜティックが箱にとどまらないのか本当にわかりません。誰かが私にヒントを与えて、私が間違っていることを教えてくれたらいいでしょう。期待してありがとう
Jean-Claude91
解決
自分で試していませんが、ここで説明を適切に読んだ場合(http://developer.android.com/reference/android/app/activity.html#oncreatecontextmenu(android.view.contextmenu、android.view.view、 android.view.contextmenu.contextmenuinfo)))、メニューが作成されるたびにレイアウトリソースが呼び出されます。 「メソッドが返された後にメニューを保持するのは安全ではない」ため、選択したアイテムを処理してその選択をどこかに保持し、選択可能なアイテムの現在の状態をMenuinfoでOnCreateに渡す必要があります。その情報を使用します。
そうでない場合は、デフォルト設定(menu.xml)に基づいて、メニューが毎回再作成されます。