2012-03-21 13 views
4

私はさまざまなオプションのリストを含むコンテキストメニューを開くボタンを持っています。一度に選択できるオプションは1つだけなので、それぞれの項目の横にラジオボタンを表示して、現在選択されている項目を強調表示します。コンテキストメニューから項目を選択すると、ラジオボタンが選択されて閉じます。コンテキストメニューを開くためにボタンをクリックすると、前に選択した項目は選択されません。Androidチェック可能なコンテキストメニューがチェックされていないことを確認しました

どのアイテムを以前に選択したかを覚えておくにはどうすればよいですか?

第2に、アクティビティが最初に作成されるとき、デフォルトオプションが選択されます。別のコンテキストメニュー項目が選択されたときに上書きできるようにするにはどうすればよいですか?私はandroid:checked="true"をXMLに設定できますが、別の項目を選択すると上書きできますか?

のJava:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.browse); 
    Button buttonView = (Button) this.findViewById(R.id.button_view); 
    buttonView.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      registerForContextMenu(v); 
      openContextMenu(v); 
     } 
    }); 
} 

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    menu.setHeaderTitle(R.string.menu_title); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.context_menu, menu); 
} 

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    switch(item.getItemId()) { 
     case(R.id.item1): 
      if(item.isChecked()) { 
       item.setChecked(false); 
      } else { 
       item.setChecked(true); 
      } 
      break; 
     case(R.id.item2): 
      if(item.isChecked()) { 
       item.setChecked(false); 
      } else { 
       item.setChecked(true); 
      } 
      break; 
     case(R.id.item3): 
      if(item.isChecked()) { 
       item.setChecked(false); 
      } else { 
       item.setChecked(true); 
      } 
      break; 
     default: 
      return super.onContextItemSelected(item); 
    } 
    return true; 
} 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <group android:id="@+id/context_menu" android:checkableBehavior="single"> 
     <item android:id="@+id/item1" 
      android:title="@string/context_menu_item1" /> 
     <item android:id="@+id/item2" 
      android:title="@string/context_menu_item2" /> 
     <item android:id="@+id/item3" 
      android:title="@string/context_menu_item3" /> 
    </group> 
</menu> 

どのような援助をいただければ幸いです!

答えて

14

ところで、あなたはそうのようなあなたの項目選択スイッチを書くことができます。 setCheckedを呼び出すたびに、現在表示されているメニューでのみ動作し、次のメニューでリセットされます。

たとえば、ブール値配列などの外部構造にチェック状態を保存する必要があります。メニュー項目を検索するために

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    menu.setHeaderTitle(R.string.menu_title); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.context_menu, menu); 

    // loop for menu items 
    for (int i = 0; i < menu.size(); ++i) { 
     MenuItem mi = menu.getItem(i); 
     // check the Id as you wish 
     if (mi.getItemId() == R.id.item2) { 
      mi.setChecked(true); 
     } 
    } 
} 

、あなたはまた、FindItem関数の機能を使用することができます。

MenuItem mi = menu.findItem(R.id.item2) 
+0

私は選択されているので、ユーザーの入力を格納します。次回コンテキストメニューを開いたときに、これを使ってアイテムを選択したものとして表示するにはどうすればよいですか? – tavocado

+0

私は答えを更新しました。したがって、onCreateContextMenuを使用して、ここでchecked状態を設定する必要があります。 – asktomsk

+0

これは今うまくいっています!ご協力いただきありがとうございます :) – tavocado

1

まあ、あなたはどこかにあなたのユーザー入力を保存し、レイアウトを膨張させた後で明示的に状態を明示的に設定する必要があります。問題は、あなたの項目は、メニューの表示の間で状態を保存していないということです

switch (item.getItemID()) { 
case R.id.item1: 
case R.id.item2: 
case R.id.item3: 
    item.setChecked(!item.isChecked()); 
} 
+0

を各ケースがちょうどこの以上のものを含んでいるが、私は単なる一例として、これを使用していました。あなたの単純化されたsetChecked()に+1! ユーザー入力を取得するにはどうすればよいですか? – tavocado

+0

item.isChecked()はユーザー入力です。 Btw、私はこれが十分に答えていない場合は、StackOverflowが新しい質問を開始するように頼むと思う... – Bondax

関連する問題