Issue
So I am trying to inflate the menu from my fragment to the ActionBar and I am able to do so but when I try to do certain actions based on item selection like
startActivity(requirecontext(),EditProfile.class) startActivity(requireActivity(),Editprofile.class)
The code looks like this.
MenuHost menuHost = requireActivity();
menuHost.addMenuProvider(new MenuProvider() {
@Override
public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
menuInflater.inflate(R.menu.creator_profile_menu, menu);
}
@Override
public boolean onMenuItemSelected(@NonNull MenuItem menuItem) {
if(menuItem.getItemId() == R.id.menuSignout)
FirebaseAuth.getInstance().signOut();
else if(menuItem.getItemId() == R.id.menuBeCreator)
startActivity(new Intent(binding.getRoot().getContext(), BeCreator.class));
else if(menuItem.getItemId() == R.id.menuEditProfile){
startActivity(new Intent(binding.getRoot().getContext(), EditProfile.class));
}
return true;
}
});
No matter where I put this code , onCreateView() , onCreate(), onAttach(), onPause()... basically it is giving me error
java.lang.IllegalStateException: Fragment ProfileFragment{9feec23} (3575ea02-dffb-4fc6-ba9b-fc6aff7cb7bf) not attached to Activity
at androidx.fragment.app.Fragment.startActivity(Fragment.java:1443)
at androidx.fragment.app.Fragment.startActivity(Fragment.java:1433)
at com.sciforearth.tafcreate.Fragments.ProfileFragment$1.onMenuItemSelected(ProfileFragment.java:227)
at androidx.core.view.MenuHostHelper.onMenuItemSelected(MenuHostHelper.java:90)
at androidx.activity.ComponentActivity.onMenuItemSelected(ComponentActivity.java:518)
at androidx.fragment.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:265)
at androidx.appcompat.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:266)
at androidx.appcompat.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:110)
at androidx.appcompat.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:66)
at androidx.appcompat.widget.Toolbar$1.onMenuItemClick(Toolbar.java:221)
at androidx.appcompat.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:781)
at androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:836)
at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:159)
at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:987)
at androidx.appcompat.view.menu.MenuPopup.onItemClick(MenuPopup.java:128)
at android.widget.AdapterView.performItemClick(AdapterView.java:330)
at android.widget.AbsListView.performItemClick(AbsListView.java:1197)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3190)
at android.widget.AbsListView.onTouchUp(AbsListView.java:4178)
at android.widget.AbsListView.onTouchEvent(AbsListView.java:3919)
at androidx.appcompat.widget.DropDownListView.onTouchEvent(DropDownListView.java:225)
at androidx.appcompat.widget.MenuPopupWindow$MenuDropDownListView.onTouchEvent(MenuPopupWindow.java:140)
at android.view.View.dispatchTouchEvent(View.java:14599)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3114)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2787)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3120)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2801)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3120)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2801)
at android.widget.PopupWindow$PopupDecorView.dispatchTouchEvent(PopupWindow.java:2553)
at android.view.View.dispatchPointerEvent(View.java:14858)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6446)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6247)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5725)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5782)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5748)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5913)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5756)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5970)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5729)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5782)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5748)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5756)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5729)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8696)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8647)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:8616)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:8819)
2022-09-02 19:24:53.778 17045-17045/com.sciforearth.tafcreate E/AndroidRuntime: at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:259)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:335)
at android.os.Looper.loopOnce(Looper.java:161)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7842)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
I tried using , getActivity(), getContext(), requireContext(),requireActivity() and then finally binding.getRoot().get... but nothing works.
Solution
I got the solution to the problem. Using this initializer solved the issue .
addMenuProvider(provider: MenuProvider, owner: LifecycleOwner)
Code looks like this now.
MenuHost menuHost = requireActivity();
menuHost.addMenuProvider(new MenuProvider() {
@Override
public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
menuInflater.inflate(R.menu.creator_profile_menu, menu);
}
@Override
public boolean onMenuItemSelected(@NonNull MenuItem menuItem) {
if(menuItem.getItemId() == R.id.menuSignout)
FirebaseAuth.getInstance().signOut();
else if(menuItem.getItemId() == R.id.menuBeCreator)
startActivity(new Intent(binding.getRoot().getContext(), BeCreator.class));
else if(menuItem.getItemId() == R.id.menuEditProfile){
startActivity(new Intent(binding.getRoot().getContext(), EditProfile.class));
}
return true;
}
}, getViewLifecycleOwner());
add getViewLifecycleOwner() as second peremeter.
Answered By - Manu
Answer Checked By - Candace Johnson (JavaFixing Volunteer)