68

Androidアプリには次のメニューレイアウトがあります。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/item1" 
          android:titleCondensed="Options"
          android:title="Highlight Options" 
          android:icon="@android:drawable/ic_menu_preferences" />

   <item android:id="@+id/item2" 
         android:titleCondensed="Persist"
         android:title="Persist" 
         android:icon="@android:drawable/ic_menu_preferences" 
         android:checkable="true" />
</menu>

私の問題は、Androidエミュレーターでアプリを実行すると、2番目のメニュー項目が「チェック可能」に表示されないことです。アイテムに緑色のチェックマークが付いているはずですよね?そのチェック可能であることを示すため。

私は何か間違ったことをしていますか?

4

9 に答える 9

83

レイアウトは正しく見えます。ただし、コードのメニュー項目をオンまたはオフにする必要があります。

ドキュメントから:

チェック可能なアイテムが選択されると、システムはそれぞれのアイテムで選択されたコールバックメソッド(などonOptionsItemSelected())を呼び出します。チェックボックスまたはラジオボタンは自動的に状態を変更しないため、ここでチェックボックスの状態を設定する必要があります。アイテムの現在の状態(ユーザーがアイテムを選択する前の状態)をクエリしてからisChecked()、でチェック状態を設定できますsetChecked()

于 2011-06-04T20:33:19.973 に答える
41

次のように、要素でitemsをラップします。group

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="all">
        <item android:id="@+id/item1"
              android:titleCondensed="Options"
              android:title="Highlight Options"
              android:icon="@android:drawable/ic_menu_preferences">
        </item>
        <item android:id="@+id/item2"
              android:titleCondensed="Persist"
              android:title="Persist"
              android:icon="@android:drawable/ic_menu_preferences"
              android:checkable="true">
        </item>
    </group>
</menu>

Androidドキュメントから:

android:checkableBehavior属性は、次のいずれかを受け入れます。

シングル-グループから1つのアイテムのみをチェックできます(ラジオボタン)

all-すべての項目をチェックできます(チェックボックス)

なし-チェック可能なアイテムはありません

于 2011-06-04T20:30:32.113 に答える
26

actionViewClassを次のようなチェック可能なウィジェットに設定することで、チェック可能なメニュー項目を作成できます。android.widget.CheckBox

res / menu / menu_with_checkable_menu_item.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_favorite"
        android:checkable="true"
        android:title="@string/action_favorite"
        app:actionViewClass="android.widget.CheckBox"
        app:showAsAction="ifRoom|withText" />
</menu>

actionLayoutまた、スタイル付きのレイアウトに設定すると、チェック可能なスターになるようにスタイルを設定することもできますandroid.widget.CheckBox

res / layout / action_layout_styled_checkbox.xml

<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
    style="?android:attr/starStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

res / menu / menu_with_checkable_star_menu_item.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_favorites"
        android:checkable="true"
        android:title="@string/action_favorites"
        app:actionLayout="@layout/action_layout_styled_checkbox"
        app:showAsAction="ifRoom|withText" />
</menu>

値を設定するには

menuItem.setChecked(true/false);

値を取得するには

menuItem.isChecked()

MenuItemをCheckBoxにキャストします

CheckBox checkBox= (CheckBox) menuItem.getActionView();
于 2016-03-22T17:07:51.967 に答える
4

最善の解決策は、現在のAPI(27-28)の時点でonOptionsItemSelected()メソッドを使用することであることがわかりました。

@Override
   public boolean onOptionsItemSelected(MenuItem item) 
   {    

//Copy from here...
       int itemId = item.getItemId();

       if(item.isChecked())                          
       { 
           if(R.id.edit_tile_checkbox == itemId)     //Individual checkbox logic
           {   /*TODO unchecked Action*/} 
           item.setChecked(false);                   //Toggles checkbox state.
       }
       else
       {
            if(R.id.edit_tile_checkbox == itemId)    //Individual checkbox logic
            {/*TODO checked Action*/}
            item.setChecked(true);                   //Toggles checkbox state.
       }
//...To here in to your onOptionsItemSelected() method, then make sure your variables are all sweet.

       return super.onOptionsItemSelected(item);
   }

私はこの答えのためにここに長い間費やしました。そして、何らかの理由で、上記の答えは役に立ちませんでした(私は戻ってきた初心者で、おそらく何かを台無しにしたと思います)。これを行うためのより良い方法があるかもしれないので、有益な批判を歓迎します。

于 2020-06-06T10:33:59.073 に答える
1

ここでの回答は長く複雑に見えるため、回答します。正確なKotlinコードがここにあります。

上部のアクティビティをオーバーライドし、関数onMenuItemClickをオーバーライドします。ボタンのクリックを処理してメニューを開く関数があります。

チェックされた値を保持し、メニューが再作成されたときにチェックを設定する配列またはリストを用意します

注:このコードはメニューを開いたままにするのではなく、チェックされた項目がチェックされたままになることを保証するだけです。スタックオーバーフローには多くの解決策があることに気づいたので、それがあなたが望むものであるかどうかを見てください

class exampleActivity : AppCompatActivity(), PopupMenu.OnMenuItemClickListener {
   private var checkChecked = arrayListOf(false,false)
   //some code

  fun clickBTN(v: View){
        val popup = PopupMenu(this,v)
        popup.setOnMenuItemClickListener(this)
        popup.inflate(R.menu.yourmenufilename)
        //assuming you have 2 or more menu items
        popup.menu[0].isChecked = checkChecked[0]
        popup.menu[1].isChecked = checkChecked[1]
        popup.show()
  }

  override fun onMenuItemClick(item: MenuItem?): Boolean {
     when(item?.itemID){
        R.id.item0 -> {
                item.isChecked = !item.isChecked
                checkChecked[0] = item.isChecked
                return true
        }
        R.id.item1 -> {
                item.isChecked = !item.isChecked
                checkChecked[1] = item.isChecked
                return true
        }
  }
}

もちろん、XMLでは、ボタンとメニューを設定する必要があります。メニューの例はこちら

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/item0"
        android:title="@string/hi"
        android:checkable="true"/>
    <item android:id="@+id/item1"
        android:title="@string/yo"
        android:checkable="true"/>
</menu>
于 2019-10-07T23:40:42.350 に答える
0

これはテーマに依存する可能性がありますが、メニューにチェックボックスが表示されませんでした。私はこれを見つけまし

注:アイコンメニューのメニュー項目は、チェックボックスまたはラジオボタンを表示できません。アイコンメニューの項目をチェック可能にする場合は、状態がオンとオフの間で変化するたびにアイコンやテキストを交換して、状態を個人的に示す必要があります。

于 2014-06-05T17:29:07.870 に答える
0

プログラムでメニュー項目を追加するには、

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    menu.add("Item1").setActionView(R.layout.action_layout_checkbox).setCheckable(true);
    return super.onCreateOptionsMenu(menu);
}

res / layout /action_layout_checkbox.xml

<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
于 2018-03-09T09:04:37.130 に答える
0

これを読む

言われているように、「手動チェック」は氷山の一角にすぎません。メニューが点滅するので、ユーザーは何も起こらないので、直感に反し、イライラし、効果的にがらくたになります。(REAL TASKしたがって)は、チェックボックスイベントがユーザーの心によって消化されることを可能にします。

良いニュース:これは実行可能であり、機能します。これがあなたのやり方です。@TouchBoarderが最高だったので、彼のコードをコピーします。その後、それを開発します。

チェックボックスがクリックされたかどうかを検出し、(そしてそれが選択された場合にのみ)メニューの削除をわずかに抑制し、500ミリ秒のタイマーを追加してからメニューを閉じると、チェックボックスの「チェック」アニメーションが実行されるようになります。正しい「感触」を生み出します

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_favorite"
        android:checkable="true"
        android:title="@string/action_favorite"
        app:actionViewClass="android.widget.CheckBox"
        app:showAsAction="ifRoom|withText" />
</menu>

次に、通常どおりこのメソッドを作成しますが、この余分なバンプをすべて追加するようにしてください

public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the bottom bar and the top bar (weird)
    BottomAppBar bottomBar = findViewById(R.id.bottom_app_bar_help);
    Menu bottomMenu = bottomBar.getMenu();
    getMenuInflater().inflate(R.menu.bottom_nav_menu, bottomMenu);
    for (int i = 0; i < bottomMenu.size(); i++) {
        bottomMenu.getItem(i).setOnMenuItemClickListener(item -> {
            if (item.getItemId()==R.id.action_favorite){
                item.setChecked(!item.isChecked());
                // Keep the popup menu open
                item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
                item.setActionView(new View(frmMain.this));
                item.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
                    @Override
                    public boolean onMenuItemActionExpand(MenuItem item) {
                        final Handler handler = new Handler();
                        handler.postDelayed(() -> bottomMenu.close(), 500);
                        return false;
                    }

                    @Override
                    public boolean onMenuItemActionCollapse(MenuItem item) {
                        final Handler handler = new Handler();
                        handler.postDelayed(() -> bottomMenu.close(), 500);
                        return false;
                    }
                });
                return false;
            }
            else {
                return onOptionsItemSelected(item);
            }
        });
    }
    return true;
}

他のメニューイベントはこちら

public boolean onOptionsItemSelected(MenuItem item) {
    // Bottom Bar item click
    try {
        switch (item.getItemId()) {
            case R.id.mnuExit:
                MenuClick(ClickType.LOGOUT);
                return true;

            case R.id.mnuList:
                MenuClick(ClickType.LIST);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return super.onOptionsItemSelected(item);
}
于 2019-08-30T10:19:59.687 に答える
0

メニューに2つの項目があり、menu.xml以下のようにファイルでチェック可能に設定されています

    <item
        android:id="@+id/A"
        android:title="A"
        app:showAsAction="never"
        android:checkable="true"/>
    <item
        android:id="@+id/B"
        android:title="B"
        app:showAsAction="never"
        android:checkable="true"/> 

メニューチェックボックスのロジックは以下のとおりです。

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {

    switch (item.getItemId()) {
        case R.id.A:
           //logic goes here


            if(item.isChecked())
            {
             //logic is it is checked
             item.setChecked(false);
            }
            else
            {
               //logic is it is not checked
                item.setChecked(true);
            }
            return true;
        case R.id.B:
         //logic for second checkbox goes here


            if(item.isChecked())
            {
             //logic is it is checked
                item.setChecked(false);
            }
            else
            {
             //logic is it is not checked
                item.setChecked(true);
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
于 2020-07-23T08:07:02.090 に答える