Подтвердить что ты не робот

PopupWindow - не работает на нескольких устройствах

Я использую следующий код, чтобы показать небольшое всплывающее окно:

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

Это работает на множестве устройств, но на некоторых редких устройствах это не работает, например:

  • Android 5.1.1 root slim rom
  • возможно, другие... до сих пор я не знаю больше о других устройствах

Я получил обратную связь, что всплывающее окно не отображается. Кто-нибудь знает, почему это не работает над вышеупомянутым устройством? И что я могу сделать, чтобы заставить его работать и на этом устройстве?

ИЗМЕНИТЬ

Кажется, что не ясно, что я хочу:

  • используйте showAsDropDown not showAtLocation или подобное, я никогда не видел эту проблему с showAtLocation еще
  • Мое решение работает почти на всех устройствах, похоже, это проблема с телефоном/ромом, возможно, она даже не разрешима, поскольку она также может быть ошибкой в ​​устройстве = > если кто-то знает такую ​​ошибку, говоря меня тоже будет хорошо
  • Вместо этого я не хочу использовать диалог (или что-то еще), не отвечающий на мой вопрос. В настоящее время я использую BottomSheet, который подходит для меня, но все же я хотел бы знать, может ли проблема быть решена и как-то обработана
4b9b3361

Ответ 1

У меня такая же проблема на Nexus 7 (не в 2012 году), работающем на 5.1.1. Наконец, он добавляется в эту строку:

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

Ответ 2

В моем случае всплывающее окно не имеет размеров на нескольких устройствах.

Попробуйте это после setContentView

50000 - просто большой размер для измерения.

    popupWindow.getContentView().measure(50000, 50000);
    popupWindow.setWidth(popupWindow.getContentView().getMeasuredWidth());
    popupWindow.setHeight(popupWindow.getContentView().getMeasuredHeight());

Вы можете использовать размер экрана вместо 50000

Ответ 3

У меня была такая же проблема: мой PopupWindow не показывался на моем 5.1.1 устройстве Android, но это было на других. Я понял, что мне нужно указать width и height, чтобы они отображались на этой версии (которая по-прежнему совместима с остальными версиями).

Вот пример:

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

Ответ 4

Некоторые ПЗУ ограничивают использование popupview своими собственными правами. Поэтому пользователь должен явно включить разрешение на отображение всплывающих просмотров.

Даже MIUI будет ограничивать popupview по умолчанию.

Пожалуйста, посмотрите, есть ли какие-либо разрешения в этих ПЗУ или устройствах.

Ответ 5

enter image description here

Попробуйте QuickAction

Activity (ExampleActivity1.java), чтобы показать, как использовать QuickAction:

public class Example1Activity extends Activity {
    private static final int ID_ADD = 1;
    private static final int ID_ACCEPT = 2;
    private static final int ID_UPLOAD = 3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.example1);

        ActionItem addItem      = new ActionItem(ID_ADD, "Add", getResources().getDrawable(R.drawable.ic_add));
        ActionItem acceptItem   = new ActionItem(ID_ACCEPT, "Accept", getResources().getDrawable(R.drawable.ic_accept));
        ActionItem uploadItem   = new ActionItem(ID_UPLOAD, "Upload", getResources().getDrawable(R.drawable.ic_up));

        //use setSticky(true) to disable QuickAction dialog being dismissed after an item is clicked
        uploadItem.setSticky(true);

        final QuickAction mQuickAction  = new QuickAction(this);

        mQuickAction.addActionItem(addItem);
        mQuickAction.addActionItem(acceptItem);
        mQuickAction.addActionItem(uploadItem);

        //setup the action item click listener
        mQuickAction.setOnActionItemClickListener(new QuickAction.OnActionItemClickListener() {
            @Override
            public void onItemClick(QuickAction quickAction, int pos, int actionId) {
                ActionItem actionItem = quickAction.getActionItem(pos);

                if (actionId == ID_ADD) {
                    Toast.makeText(getApplicationContext(), "Add item selected", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getApplicationContext(), actionItem.getTitle() + " selected", Toast.LENGTH_SHORT).show();
                }
            }
        });

        mQuickAction.setOnDismissListener(new QuickAction.OnDismissListener() {
            @Override
            public void onDismiss() {
                Toast.makeText(getApplicationContext(), "Ups..dismissed", Toast.LENGTH_SHORT).show();
            }
        });

        Button btn1 = (Button) this.findViewById(R.id.btn1);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mQuickAction.show(v);
            }
        })

        Button btn2 = (Button) this.findViewById(R.id.btn2);
        btn2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mQuickAction.show(v);
                mQuickAction.setAnimStyle(QuickAction.ANIM_GROW_FROM_CENTER);
            }
        });
    }
}

Выход:

enter image description here
(источник: unitid.nl)

Ответ 6

введите описание изображения здесь ## Хорошо, я реализовал popupwindow для сортировки в мой фрагмент вкладки, и я проверил, как работает, попробуйте это

Я использовал в этом настраиваемом макете для всплывающего окна

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

Найдите приведенный ниже снимок экрана popupwindow в моем приложении

Ответ 7

Я создал настраиваемый всплывающий диалог, отображаемый внизу экрана

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>

И этот диалог работает на всех устройствах:)