Android-无法在Fragment中使用弹出窗口 [英] Android - Can not use popup in Fragment

查看:174
本文介绍了Android-无法在Fragment中使用弹出窗口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Android新手.现在,我正在尝试创建一个滑块.现在,我创建了一个滑块.现在,我想在单击操作栏中的图标时显示弹出窗口. 当我扩展活动时,弹出窗口工作正常.但是,当我将其更改为Fragment片段时,将无法使用弹出窗口.请让我知道片段"页面中弹出窗口的任何想法或示例.

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

我遇到了错误:-

很多错误.请帮我解决这个问题.预先感谢.

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

LogCat错误消息:-

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)

推荐答案

我进行扩展活动时,弹出窗口工作正常.但是当我改变 碎片化程度,我无法使用弹出窗口.

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

您可以直接为Activity调用findViewById(),但是当您使用Fragment时,您将需要一个视图对象来调用findViewById(). 例如. getView().findViewById();

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. 视图-findViewById()

活动-findViewById()

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

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

新的PopupMenu(this,menuItemView);

new PopupMenu(this, menuItemView);

此处弹出菜单需要Context,并作为第一个参数传递.如果您正在活动中,可以使用this,但是在Fragment中,您需要使用getActivity()而不是this

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(上下文上下文,查看锚点)

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

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

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

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

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

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

class ---用于意图的组件类.

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

只要要显示Fragment中的Toast,就使用getActivity().getApplicationContext()而不是getApplicationContext()

Use getActivity().getApplicationContext() instead of just getApplicationContext() whenever you want to display 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 没有锚点

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

您会收到此异常,因为我想此弹出窗口的锚点"视图为null.因此,每当系统尝试显示弹出窗口时,都会出现此异常.

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.

只需检查tryShow() 另请参阅 Maxim Zaslavsky

这篇关于Android-无法在Fragment中使用弹出窗口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆