Android-无法在片段中使用弹出窗口

Android-无法在片段中使用弹出窗口,android,popup,fragment,Android,Popup,Fragment,我是android新手。现在我正在尝试创建一个滑动条。现在我已经创建了一个滑动条。现在,我想在单击操作栏中的图标时显示弹出窗口。 当我扩展活动时,弹出窗口工作正常。但是当我变成区段片段时,我不能使用弹出窗口。请让我知道任何想法或任何在片段页面弹出的例子 public void popup_window() { View menuItemView = findViewById(R.id.menu_popup); PopupMenu popupMenu = new PopupMenu

我是android新手。现在我正在尝试创建一个滑动条。现在我已经创建了一个滑动条。现在,我想在单击操作栏中的图标时显示弹出窗口。 当我扩展活动时,弹出窗口工作正常。但是当我变成区段片段时,我不能使用弹出窗口。请让我知道任何想法或任何在片段页面弹出的例子

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();
}
我得到一个错误:-

很多错误。请帮我解决这个问题。提前谢谢

LogCat错误消息:-

    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)

您可以使用以下选项代替:getApplicationContext()

使用此:我的活动。此使用
getActivity().getApplicationContext()
内部片段

当我扩展活动时,弹出窗口工作正常。但当我改变 我不能使用弹出窗口

对于
活动
,您可以直接调用
findViewById()
,但是当您使用
片段
时,您将需要一个视图对象来调用
findViewById()
。 例如:getView().findViewById()

  • --这将返回片段的根视图,通过它您可以调用
    findViewById()

  • 新建弹出菜单(此菜单为menuItemView)

    此处弹出菜单需要
    上下文
    ,作为第一个参数传递。如果您在活动中,可以使用
    this
    ,但是在片段中,您需要使用
    getActivity()
    而不是
    this

    新意图(List\u Activity.this,List\u Activity.class)

    这是错误的,实际上它应该是包上下文和类

    packageContext
    ——实现此类的应用程序包的上下文

    class
    ——用于目的的组件类

    无论何时,只要想显示
    Toast
    from
    Fragment

    所以你的代码看起来像

    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();
    }
    
    更新:

    java.lang.IllegalStateException:无法使用MenuPopupHelper 没有锚

    你得到这个异常是因为这个弹出窗口的锚视图是空的。因此,每当系统试图显示弹出窗口时,它都会给出此异常

    只需在中查看
    tryShow()


    另请参见Maxim Zaslavsky的on SO

    问题是弹出窗口或对话框与“活动”关联,您需要此处的活动上下文。但这指的是你的“碎片”

    一种方法是在创建片段实例时传递
    Activity
    上下文,或者使用
    Fragment
    getActivity
    方法返回活动上下文

    所以像这样更改代码

         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();
     }
    
    试试这个:

     PopupMenu popupMenu = new PopupMenu(getActivity, menuItemView);
    

    PopupMenu容易出现的另一个问题是调用菜单项隐藏在三个点(溢出菜单)中。这些条目不能锚定到弹出菜单

    这是我第一个得到的java.lang.IllegalStateException:MenuPopupHelper不能在没有锚的情况下使用:

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

    对于弹出菜单,需要活动上下文,因此将fragment.Hi@Mohd Mufiz.中的所有上下文替换为getActivity()。。谢谢你的答复。。PopupMenu PopupMenu=新建PopupMenu(此菜单为menuItemView);这行仍然有错误。请帮助我解决此问题。使用PopupMenu=new PopupMenu(getActivity(),menuItemView);现在所有的错误都被清除了。但当我点击图标时,应用程序正在强制关闭。嗨@Ritesh Gune。。谢谢你的详细解释。。现在我已经清除了所有的错误。但是当我点击图标时,Pop不显示。当我点击图标时,强制关闭。你能发布stacktrace吗?嗨@Ritesh Gune。。我在原来的post.popupMenu.setOnMenuItemClickListener(新的popupMenu.OnMenuItemClickListener(){public boolean onMenuItemClick(MenuItem项)中添加了LogCat错误消息{这里只有我得到了错误。Hi@Libin..谢谢你的努力。现在编码没有错误。但是当我单击图标时,应用程序强制关闭。Hi@Libin..popupMenu.setOnMenuItemClickListener(新建popupMenu.OnMenuItemClickListener(){公共布尔值onMenuItemClick(MenuItem项){我在这里遇到错误。如果您使用的是支持android.support.v7.widget.PopupMenu,请确保android:theme=“@style/theme.AppCompat”。请告诉我正确答案
    <item android:id="@+id/menu_entry_to_show_popupmenu"
     app:showAsAction="always" />
    
    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();
    }