弹出窗口在一些设备上无法正常工作

16

我使用以下代码来显示一个小弹窗:

public static PopupWindow showImportMenu(Activity activity, View anchor, PopupWindowClickListener onClickListener)
{
    LayoutInflater inflater = LayoutInflater.from(activity);

    PopupImportBinding binding = DataBindingUtil.inflate(inflater, R.layout.popup_import, null, false);

    if (!RootTools.isRootAvailable())
        binding.llImportRootMethod.setVisibility(View.GONE);


    PopupWindow popupWindow = new PopupWindow(activity, null, R.attr.popupMenuStyle);
    popupWindow.setFocusable(true);
    popupWindow.setContentView(binding.getRoot());
    popupWindow.setOutsideTouchable(true);
    PopupWindowCompat.showAsDropDown(popupWindow, anchor, 0, 0, Gravity.BOTTOM);

    View.OnClickListener clickListener = new View.OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
            onClickListener.onClick(popupWindow, view);
        }
    };

    binding.llImportDefault.setOnClickListener(clickListener);
    binding.llImportRootMethod.setOnClickListener(clickListener);
    binding.llImportHTCFromContacts.setOnClickListener(clickListener);
    binding.llImportManual.setOnClickListener(clickListener);

    return popupWindow;
}

这在很多设备上都可以工作,但在某些罕见的设备上不起作用,例如:

  • 安卓 5.1.1 root slim rom
  • 可能还有其他设备...到目前为止,我对其他设备并不了解

我得到的反馈是没有弹出窗口。有人知道为什么在上述设备上不起作用吗?我该怎么做才能在这个设备上使它也能工作?

编辑

似乎不清楚我想要的是以下内容:

  • 使用 showAsDropDown 而不是 showAtLocation 或类似的方法,我从未看到过使用 showAtLocation 出现这个问题
  • 我的解决方案在几乎所有设备上都可以工作,似乎是手机/rom特定的问题,也许它甚至可以作为设备中的一个 bug 解决 => 如果有人知道这样的 bug,请告诉我
  • 我不想使用对话框(或其他任何东西)代替,这并不能回答我的问题。我目前使用的是 BottomSheet,对我来说很好,但我仍然想知道问题是否可以解决并进行处理


1
你有那些设备的堆栈跟踪吗? - azizbekian
1
这个设备没有崩溃,只是没有显示任何东西。但我请求了logcat,尽管还没有收到。 - prom85
1
至少应该出现一些系统日志。 - azizbekian
1
为什么不向他/她要求视频,这样你就可以更好地检查,并且会对他/她在做什么以及造成的原因有一个好的了解。 - Drim
你使用了showAtLocation吗?在一些设备上,我发现showAsDropDown会给出锚点位置为零的情况。 - androidcodehunter
显示剩余2条评论
6个回答

7

我在一台 Nexus 7 上 (不是2012版),运行的是 5.1.1 系统,也遇到了同样的问题。最终通过添加这一行代码来解决:

popupWindow.setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

这解决了我的问题。你有什么想法,为什么只有一些设备需要这个? - Prasad Pawar
非常感谢,这解决了我的问题 API 19 - Galaxy note 3。 - DIRTY DAVE

4

我曾经遇到同样的问题:我的PopupWindow在我的5.1.1 android设备上没有显示,但在其他设备上正常。我意识到我必须指定widthheight以便在该版本上显示(同时仍与其他版本兼容)。

以下是一个示例:

popUp.setWidth(MATCH_PARENT);
popUp.setHeight(WRAP_CONTENT);

2
在我的情况下,弹出窗口在一些设备上没有大小。在setContentView之后尝试以下操作:50000——只是一个用于度量的大尺寸。
    popupWindow.getContentView().measure(50000, 50000);
    popupWindow.setWidth(popupWindow.getContentView().getMeasuredWidth());
    popupWindow.setHeight(popupWindow.getContentView().getMeasuredHeight());

你可以使用屏幕尺寸代替50000。

1
一些ROM限制使用popupview时必须使用它们自己的权限。 因此,用户必须明确开启权限以显示弹出视图。
即使是MIUI默认情况下也将限制popupview的显示。
请查看该ROM或设备中是否有任何权限。

那是唯一可用的答案,谢谢。这个权限有名称吗?它可以在清单或运行时请求吗?还是那些人只能在系统中手动授予此权限?是否可以测试Rom是否需要弹出视图的权限?尽管没有问题,但弹出菜单仍然很奇怪。 - prom85
这种权限不包含在Android操作系统中。因此,我们无法使用Android requestpermission方法来授予运行时权限。其中一个选项是,我们可以将用户导航到该权限屏幕。 - Sangeet Suresh

0

在这里输入图像描述## 好的,我在我的选项卡片段中实现了弹出窗口以进行排序,并且我已经检查过它的工作正常。你可以试一下。

我在自定义布局中使用了这个弹出窗口

  final PopupWindow popupWindow = new PopupWindow(getActivity());
            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View view = inflater.inflate(R.layout.popmenu1t1, null);
            l8[![enter image description here][1]][1] = (LinearLayout) view.findViewById(R.id.atoz);


  l8.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    date_sort="0";
                    discount_sort="";
                    price_sort="";
                    alpha_sort="";
                    popupWindow.dismiss();
                }
            });
            int width = 900;
            int height = 400;
            try {
                WindowManager wm = (WindowManager)view.getContext().getSystemService(Context.WINDOW_SERVICE);
                width = wm.getDefaultDisplay().getWidth();
                height = wm.getDefaultDisplay().getHeight();
            } catch (Exception e) {
                e.printStackTrace();
            }
            popupWindow.setWidth(width*3/6);
            popupWindow.setFocusable(true);
            popupWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
            popupWindow.setContentView(view);
            popupWindow.setBackgroundDrawable(null);
            popupWindow.setOutsideTouchable(true);
            popupWindow.showAtLocation(view, Gravity.CENTER, 0, 0);

请在我的应用程序中查找下面附加的屏幕截图弹出窗口。

0

我已经创建了一个自定义弹出对话框,显示在屏幕底部

public class MoreOptionDialog {

private Dialog dialog;
private Context context;
private int size;

public MoreOptionDialog(Context context) {
    this.context = context;    
}

public void showMoreOptionDialog(List<String> listMoreOption) {

    dialog = new Dialog(new ContextThemeWrapper(context, R.style.DialogSlideAnim));
    dialog.getWindow().setWindowAnimations(R.style.DialogSlideAnim);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    View view = View.inflate(context, R.layout.dialog_more_option, null);

    dialog.setContentView(view, new LinearLayout.LayoutParams(utility.getScreenWidth() - 100, size));
    dialog.getWindow().setGravity(Gravity.BOTTOM);

    ListView listView = (ListView) view.findViewById(R.id.lvMoreOption);

    MoreOptionAdapter moreOptionAdapter = new MoreOptionAdapter(context, listMoreOption, Gravity.CENTER);
    listView.setAdapter(moreOptionAdapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
            dialog.dismiss();                
        }
    });

    dialog.show();
}
}

样式在这里

<style name="DialogSlideAnim">
    <item name="android:windowAnimationStyle">@style/DialogAnimation</item>
    <item name="android:windowBackground">@color/color_white</item>
    <item name="android:windowFrame">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
</style>

而且这个对话框在所有设备上都能正常工作 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接