0

I am having a Fragment and below is how i am adding menus in my onCreateOptionsMenu programatically

 @Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {

        menu.add(0, 0, 0, new Config().menuIconWithText(
                Objects.requireNonNull(ContextCompat.getDrawable(requireActivity(), R.drawable.ic_start)),
                requireActivity().getString(R.string.start)));

       menu.add(1, 1, 1, new Config().menuIconWithText(
                Objects.requireNonNull(ContextCompat.getDrawable(requireActivity(), R.drawable.ic_stop)),
                requireActivity().getString(R.string.stop)));

    super.onCreateOptionsMenu(menu, inflater);

    }

Below is my menuIconWithText function used in the adding of the menus

public CharSequence menuIconWithText(Drawable drawable, String title) {

        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
        SpannableString spannableString = new SpannableString("    " + title);
        ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM);
        spannableString.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        return spannableString;
    }

What i would like to achieve is for the menus to have a checkbox

Below is what i have tried

I first tried creating menus in menu layout and adding to onPrepareOptionsMenu method like below


@Override
    public void onPrepareOptionsMenu(@NonNull Menu menu) {

        MenuItem enableFareTenderMenu = menu.findItem(R.id.enable_dark_theme);
        enableFareTenderMenu.setChecked(false);

        super.onPrepareOptionsMenu(menu);

    }

Below is the layout that has id enable_dark_theme


<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/enable_dark_theme"
        android:title="@string/enable_dark_theme"
        app:showAsAction="never"
        android:checkable="true"/>
</menu>

But i got the error below


java.lang.NullPointerException: Attempt to invoke interface method 'android.view.MenuItem android.view.MenuItem.setChecked(boolean)' on a null object reference
        at myapps.apps.manuapp.fragments.MyFragment.onPrepareOptionsMenu(MyFragment.java:2321)
        at androidx.fragment.app.Fragment.performPrepareOptionsMenu(Fragment.java:3144)
        at androidx.fragment.app.FragmentManager.dispatchPrepareOptionsMenu(FragmentManager.java:2923)
        at androidx.fragment.app.Fragment.performPrepareOptionsMenu(Fragment.java:3146)
        at androidx.fragment.app.FragmentManager.dispatchPrepareOptionsMenu(FragmentManager.java:2923)
        at androidx.fragment.app.FragmentController.dispatchPrepareOptionsMenu(FragmentController.java:414)
        at androidx.fragment.app.FragmentActivity.onPreparePanel(FragmentActivity.java:447)
        at androidx.appcompat.view.WindowCallbackWrapper.onPreparePanel(WindowCallbackWrapper.java:99)
        at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.onPreparePanel(AppCompatDelegateImpl.java:3148)
        at androidx.appcompat.app.AppCompatDelegateImpl.preparePanel(AppCompatDelegateImpl.java:1936)
        at androidx.appcompat.app.AppCompatDelegateImpl.doInvalidatePanelMenu(AppCompatDelegateImpl.java:2190)
        at androidx.appcompat.app.AppCompatDelegateImpl$2.run(AppCompatDelegateImpl.java:273)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:986)
        at android.view.Choreographer.doCallbacks(Choreographer.java:764)
        at android.view.Choreographer.doFrame(Choreographer.java:696)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:965)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7073)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)

I have also tried setting actionView to the menu with a checkbox layout but its not showing the checkbox. Below is how i tried setting actionView

menu.add(5, 5, 5, "Enable Dark Theme").setActionView(R.layout.check_box_layout).setChecked(false);

And the check_box_layout looks like this below


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

Emmanuel Njorodongo
  • 1,004
  • 17
  • 35

1 Answers1

0

I think you are calling the wrong method on the MenuItem object: menuItem.setChecked(true);

Instead, you should call menuItem.setCheckable(true);

Rafael Sierra
  • 433
  • 5
  • 11