【问题标题】:PopupWindow Dim Background in Android 6 (Marshmallow)Android 6(棉花糖)中的 PopupWindow 昏暗背景
【发布时间】:2023-03-26 09:50:01
【问题描述】:

我正在使用以下代码脚本为 Android PopupWindow 做暗淡的背景。它适用于除版本 6 (Marshmallow) 之外的 android 版本。

它抛出“无法将 FrameLayout.LayoutParams 转换为 WindowManager.LayoutParams”

Android 6 版如何解决此问题。我不想使用 Dialog。

PopupWindow popup = new PopupWindow(contentView, width, height);
popup.setBackgroundDrawable(null);
popup.showAsDropDown(anchor);

WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams p = (WindowManager.LayoutParams) contentView.getLayoutParams();
p.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND;
p.dimAmount = 0.3f;
wm.updateViewLayout(contentView, p);

【问题讨论】:

标签: android popupwindow android-6.0-marshmallow


【解决方案1】:

您可以使用自定义对话框而不是弹出窗口。弹出窗口在 android 6 中创建问题。您可以在自定义对话框中执行所有操作,例如弹出窗口。 只需创建一个布局并膨胀到对话框中,您将获得 dailog 的每个属性。这是代码。

 final Dialog dialog = new Dialog(context);
  dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); //for remove default title
    dialog.setCancelable(false); //for canceal back button click 
    dialog.setContentView(R.layout.payment_popup_window);

    ImageButton variable_name=(ImageButton)dialog.findViewById(R.id.xml_id);
    ImageButton variable_name2=(ImageButton)dialog.findViewById(R.id.xml_id2);
    Button variable_name3=(Button)dialog.findViewById(R.id.xml_id3);
    variable_name1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          //your code
            dialog.dismiss();
        }
    });

   variable_name2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //your code
            dialog.dismiss();
        }
    });

    variable_name3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dialog.dismiss();
        }
    });
    dialog.show();
    Window window = dialog.getWindow();
    window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); //for making dialog fit in android screen

沿着这个外部触摸无法消除它。你不能在 android 6 的弹出窗口中得到这个。

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题。对于 Marshmallow 及以上版本,您需要再添加一个 getParent() 来访问容器。使用下面的代码:

    if (android.os.Build.VERSION.SDK_INT > 22) {
        contentView = (View) pwindow.getContentView().getParent().getParent();
    } else {
        contentView = (View) pwindow.getContentView().getParent();
    }
    

    【讨论】:

      【解决方案3】:

      这适用于 Android M 及更高版本:

      public static void controlPopupDim(PopupWindow popupWindow, boolean showing) {
          View parent = popupWindow.getContentView().getRootView();
          Context context = parent.getContext();
          WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
          WindowManager.LayoutParams wlp = (WindowManager.LayoutParams) parent.getLayoutParams();
          wlp.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
          wlp.dimAmount = showing ? 0.5f : 0f;
          if (wm != null) {
              wm.updateViewLayout(parent, wlp);
          }
      }
      

      当您在弹出窗口上调用showAsDropDown 时,您基本上需要使用true 调用它,在弹出窗口被关闭时使用false 调用它(可能通过onDismissListener

      【讨论】:

        猜你喜欢
        • 2016-01-04
        • 2016-02-06
        • 2016-02-10
        • 1970-01-01
        • 1970-01-01
        • 2016-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多