2011-07-13 9 views
13

によって正しく表示されない確認 たMenuItemのは、私がのMenuItemをこのように定義されている状態は、そのアイコン

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:state_checked="false" 
     android:drawable="@drawable/btn_star_off_normal" /> 
    <item 
     android:state_checked="true" 
     android:drawable="@drawable/btn_star_on_normal" /> 
</selector> 

私はこれを使用してオプションメニューを作成

、しかし、 MenuItemisChecked()プロパティがtrueであっても、アイコンはチェックされた状態で決して表示されません。

私はActionBarSherlockコントロールを使用していますが、通常のオプションメニューを作成してsetChecked(true)と呼んでも同じ結果が得られます。チェックされた項目の状態にかかわらず、引き続きbtn_star_off描画可能を表示します。

onOptionsItemSelected()メソッドが正常に呼び出されている、と私は成功しcheckedプロパティを変更することができます:ここにブレークポイントを設定する

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     if(item.isCheckable()) { 
      item.setChecked(!item.isChecked()); 
     } 
     return super.onOptionsItemSelected(item); 
} 

は変更されるにisCheckedプロパティを示しているが、アイコン自体は正しいを反映するように更新されていません状態。

ここに何か不足していますか?私はこれを間違ってやっていますか?なぜこれが正しく動作しないのかわかりません。

+0

私は同じことが、state_checkedが何らかの理由 – gregm

答えて

31

http://developer.android.com/guide/topics/ui/menus.html

ノートの公式文書によると:(オプションメニューから)アイコンメニュー内のメニュー項目は は、チェックボックスやラジオボタンを表示することはできません。 アイコンメニューの項目をチェック可能にする場合、は、 によって状態を変更するたびに手動でチェック状態を指定する必要があります。

希望します。

+0

ああのためのメニューアイコンのために動作しません、私は私がすることを逃したのか分からない見つかった - 私はそのドキュメントを通じて数回をお読みください。ありがとう! –

+0

私にとって混乱する部分は、 'checkable =" true "'を追加するとメニュー項目にチェックボックスが追加され、この警告はすべてのメニューではなくアイコンメニューのメニュー項目にのみ適用されるようです。 – Flimm

10

それでもXMLの描画可能に定義された動作(チェックされていない、確認を)持っているしたい場合は、これはあなたがこれを達成する可能性が一つの方法である:

if (item.getItemId()==R.id.menu_item){ 
    item.setChecked(!item.isChecked()); 
    StateListDrawable stateListDrawable = (StateListDrawable) getResources().getDrawable(R.drawable.selector_drawable); 
    int[] state = {item.isChecked()?android.R.attr.state_checked:android.R.attr.state_empty}; 
    stateListDrawable.setState(state); 
    item.setIcon(stateListDrawable.getCurrent()); 
} 
+0

'R.drawable.selector_drawable'とは何ですか? – Flimm

+0

複数の状態(フォーカス、押された状態など)を含むXML描画可能です。上記の例では、 'btn_star.xml'となるでしょう –

4

ビット簡単な方法(XML-状態ファイルなし):

configChecked = !configChecked; 
item.setChecked(configChecked); 
item.setIcon(configChecked ? R.drawable.check_on : R.drawable.check_off); 
+0

なぜ' configChecked'変数が必要ですか? – Flimm

+0

Flimm、チェックボックスをクリックするたびに反対の値に変更する必要があるため – kolyaseg

関連する問題