Question

I am new to android. Now I am trying to create a slider bar. Now I have created a slider bar. Now I want to show popup when I click the icon in Action bar. When I extents activity the popup is working fine. But when I change into extents Fragment I can not use the popup. Please let me know any idea or any example for popup in Fragment page.

public void popup_window() {
    View menuItemView = findViewById(R.id.menu_popup);
    PopupMenu popupMenu = new PopupMenu(this, menuItemView);
    popupMenu.getMenuInflater().inflate(R.menu.list_, popupMenu.getMenu());

    popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {  
                case R.id.action_ticket:  
                    Intent intdn = new Intent(List_Activity.this,List_Activity.class);
                    intdn.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);                   
                    startActivity(intdn);
                  break;    

                case R.id.action_survey:  
                    Toast.makeText(getApplicationContext(),"Under Construction ",Toast.LENGTH_LONG).show();  
                    break;      
                case R.id.action_service_request:  
                    Toast.makeText(getApplicationContext(),"Under Construction ",Toast.LENGTH_LONG).show();  
                    break;  

                  default: 
                      break;  

            }  
             return true;
        }
    });
    popupMenu.show();
}

I am getting error:- Error Image

Lots of error. Please help me to solve this issue. Thanks in advance.

LogCat Error Message:-

    FATAL EXCEPTION: main
java.lang.IllegalStateException: MenuPopupHelper cannot be used without an anchor
at com.android.internal.view.menu.MenuPopupHelper.show(MenuPopupHelper.java:101)
at android.widget.PopupMenu.show(PopupMenu.java:108)
at com.example.sample.Testing_Fragment1.popup_window(Testing_Fragment1.java:262)
at com.example.sample.Testing_Fragment1.onOptionsItemSelected(Testing_Fragment1.java:227)
at android.app.Fragment.performOptionsItemSelected(Fragment.java:1801)
at android.app.FragmentManagerImpl.dispatchOptionsItemSelected(FragmentManager.java:1959)
at android.app.Activity.onMenuItemSelected(Activity.java:2551)
at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:980)
at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:547)
at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:115)
at android.view.View.performClick(View.java:4204)
at android.view.View$PerformClick.run(View.java:17355)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
Was it helpful?

Solution

When I extents activity the popup is working fine. But when I change into extents Fragment I can not use the popup.

you can call findViewById() directly for Activity, however as you are using a Fragment, youo will need a view object to call findViewById(). eg. getView().findViewById();

  1. View - findViewById()

  2. Activity - findViewById()

    getView() --This will return the root view for the fragment, with this you can call findViewById()

new PopupMenu(this, menuItemView);

Here popup menu requires Context, passed as first parameter. You can use this if you are in activity, however in Fragment you need to use getActivity() instead of this

PopupMenu(Context context, View anchor)

new Intent(List_Activity.this,List_Activity.class);

this is wrong, Actually it should be package context and class

packageContext --- A Context of the application package implementing this class.

class --- The component class that is to be used for the intent.

Use getActivity().getApplicationContext() instead of just getApplicationContext() whenever you want to display Toast from Fragment

So your code will look like

public void popup_window() {

View menuItemView = getView().findViewById(R.id.menu_popup);
PopupMenu popupMenu = new PopupMenu(getActivity(), menuItemView);
popupMenu.getMenuInflater().inflate(R.menu.list_, popupMenu.getMenu());

popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()) {  
            case R.id.action_ticket:  
                Intent intdn = new Intent(getActivity(),List_Activity.class); // Your nxt activity name instead of List_Activity
                intdn.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);                   
                getActivity().startActivity(intdn);
              break;    

            case R.id.action_survey:  
                Toast.makeText(getActivity().getApplicationContext(),"Under Construction ",Toast.LENGTH_LONG).show();  
                break;      
            case R.id.action_service_request:  
                Toast.makeText(getActivity().getApplicationContext(),"Under Construction ",Toast.LENGTH_LONG).show();  
                break;  

              default: 
                  break;  

        }  
         return true;
    }
});
popupMenu.show();
}

UPDATE:

java.lang.IllegalStateException: MenuPopupHelper cannot be used without an anchor

You get this exception because the Anchor view for this popup is null I guess. Hence whenever system tries to show the popup, it gives you this exception.

Just check the tryShow() in MenuPopupHelper

Also refer to this post on SO by Maxim Zaslavsky

OTHER TIPS

Problem is popup or dialogs are associated with 'Activity' , you need the Activity context here. But this refers to your 'Fragment'.

One way is to pass the Activity context when you create the instance of Fragment or use the getActivity method of the Fragment which will return the activity context.

So change your code like this

     public void popup_window() {
View menuItemView = getView().findViewById(R.id.menu_popup);
PopupMenu popupMenu = new PopupMenu(getActivity(), menuItemView);
popupMenu.getMenuInflater().inflate(R.menu.list_, popupMenu.getMenu());

popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()) {  
            case R.id.action_ticket:  
                Intent intdn = new Intent(getActivity(),List_Activity.class);
                intdn.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);                   
                startActivity(intdn);
              break;    

            case R.id.action_survey:  
                Toast.makeText(getActivity(),"Under Construction ",Toast.LENGTH_LONG).show();  
                break;      
            case R.id.action_service_request:  
                Toast.makeText(getActivity(),"Under Construction ",Toast.LENGTH_LONG).show();  
                break;  

              default: 
                  break;  

        }  
         return true;
       }
    });
    popupMenu.show();
 }

Another problem that easily happens with PopupMenus is the calling menu entry is hidden in the three dots (overflow menu). These entries can't have a popupmenu anchored to it.

This is what I had first and got the java.lang.IllegalStateException: MenuPopupHelper cannot be used without an anchor:

<item android:id="@+id/menu_entry_to_show_popupmenu"
 app:showAsAction="ifRoom" />

and what I needed is

<item android:id="@+id/menu_entry_to_show_popupmenu"
 app:showAsAction="always" />

My full popupmenu setup function from an activity begins like this:

PopupMenu popup = new PopupMenu(getActivity(), getActivity().findViewById(R.id.menu_filter));
    popup.getMenuInflater().inflate(R.menu.filter_tasks, popup.getMenu());
    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
    [...]
    popup.show();
}

you can use instead of this : getApplicationContext()

use this : My_Activity.this

use getActivity().getApplicationContext() inside fragment.

Try this:

 PopupMenu popupMenu = new PopupMenu(getActivity, menuItemView);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top