简书链接:【原创】修改toolbar上弹出菜单checkbox颜色样式 文章字数:152,阅读全文大约需要1分钟
menu.xml
1 2 3 4 5 6 <item android:checkable="true" android:id="@+id/action_disable_keyboard" android:title="@string/disable_keyboard" app:showAsAction="ifRoom" ></item>
checkable只对toolbar应用有效,否则无法看到checkbox。 根据源代码追踪
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <init>:74, ListMenuItemView (androidx.appcompat.view.menu) newInstance0:-1, Constructor (java.lang.reflect) newInstance:343, Constructor (java.lang.reflect) createView:856, LayoutInflater (android.view) createViewFromTag:1012, LayoutInflater (android.view) createViewFromTag:963, LayoutInflater (android.view) inflate:661, LayoutInflater (android.view) inflate:536, LayoutInflater (android.view) getView:94, MenuAdapter (androidx.appcompat.view.menu) measureIndividualMenuWidth:161, MenuPopup (androidx.appcompat.view.menu) tryShow:174, StandardMenuPopup (androidx.appcompat.view.menu) show:208, StandardMenuPopup (androidx.appcompat.view.menu) showPopup:296, MenuPopupHelper (androidx.appcompat.view.menu) tryShow:182, MenuPopupHelper (androidx.appcompat.view.menu) run:792, ActionMenuPresenter$OpenOverflowRunnable (androidx.appcompat.widget) handleCallback:938, Handler (android.os) dispatchMessage:99, Handler (android.os) loop:236, Looper (android.os) main:8063, ActivityThread (android.app) invoke:-1, Method (java.lang.reflect) run:676, RuntimeInit$MethodAndArgsCaller (com.android.internal.os) main:1011, ZygoteInit (com.android.internal.os)
setCheckable
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 @Override public void setCheckable(boolean checkable) { if (!checkable && mRadioButton == null && mCheckBox == null) { return; } // Depending on whether its exclusive check or not, the checkbox or // radio button will be the one in use (and the other will be otherCompoundButton) final CompoundButton compoundButton; final CompoundButton otherCompoundButton; if (mItemData.isExclusiveCheckable()) { if (mRadioButton == null) { insertRadioButton(); } compoundButton = mRadioButton; otherCompoundButton = mCheckBox; } else { if (mCheckBox == null) { insertCheckBox(); } compoundButton = mCheckBox; otherCompoundButton = mRadioButton; } if (checkable) { compoundButton.setChecked(mItemData.isChecked()); if (compoundButton.getVisibility() != VISIBLE) { compoundButton.setVisibility(VISIBLE); } // Make sure the other compound button isn't visible if (otherCompoundButton != null && otherCompoundButton.getVisibility() != GONE) { otherCompoundButton.setVisibility(GONE); } } else { if (mCheckBox != null) { mCheckBox.setVisibility(GONE); } if (mRadioButton != null) { mRadioButton.setVisibility(GONE); } } } ```` 最后定位到
private void insertCheckBox() { LayoutInflater inflater = getInflater(); mCheckBox = (CheckBox) inflater.inflate(R.layout.abc_list_menu_item_checkbox, this, false); addContentView(mCheckBox); }
1 2 3 因此得到如下解决办法 新建布局 设置buttontinit
abc_list_menu_item_checkbox.xml
如果使用attr+动态设置主题则需要改成appcompatbox,