พื้นหลังเบลอหรือสลัวเมื่อเปิดใช้งาน Android PopupWindow


85

ฉันต้องการให้พื้นหลังเบลอหรือหรี่แสงได้เมื่อฉันแสดงหน้าต่างป๊อปอัปโดยใช้popup.showAtLocationและยกเลิกการเบลอ / หรี่พื้นหลังเมื่อpopup.dismissถูกเรียก

ฉันได้ลองใช้พารามิเตอร์เค้าโครงFLAG_BLUR_BEHINDและFLAG_DIM_BEHINDกับกิจกรรมของฉันแล้ว แต่ดูเหมือนว่าจะเบลอและทำให้พื้นหลังมืดลงทันทีที่แอปของฉันเริ่มทำงาน

ฉันจะเบลอ / ลดแสงด้วยป๊อปอัปได้อย่างไร?


1
คำเตือน: FLAG_BLUR_BEHIND มีปัญหาในโทรศัพท์บางรุ่นและทำให้โทรศัพท์ไม่ตอบสนองอย่างมาก (เห็นได้ชัดว่าการเบลอเกิดขึ้นในซอฟต์แวร์) บน Droid เช่น นอกเหนือจากนั้นสิ่งที่ Macarse พูด - ต้องใช้ FLAG_BLUR_BEHIND กับหน้าต่างที่อยู่เบื้องหน้า
EboMike


1
ฉันกำลังมองหาคำตอบเดียวกันสำหรับคำถามนี้ มีวิธีใดบ้างที่ฉันสามารถหรี่มุมมองที่อยู่ด้านหลังหน้าต่างป๊อปอัปโดยทางโปรแกรมได้หรือไม่
นิค

1
@Nick คุณแก้ปัญหานี้อย่างไร ..
Amit

คำตอบ:


108

คำถามเกี่ยวกับPopupwindowชั้นเรียน แต่ทุกคนก็ให้คำตอบที่ใช้Dialogชั้นเรียน นั่นค่อนข้างไร้ประโยชน์ถ้าคุณต้องใช้PopupwindowคลาสเพราะPopupwindowไม่มีgetWindow()วิธีการ

Popupwindowฉันได้พบวิธีการแก้ปัญหาที่ใช้งานได้จริงด้วย ต้องการให้รูทของไฟล์ xml ที่คุณใช้สำหรับกิจกรรมเบื้องหลังเป็นไฟล์FrameLayout. คุณสามารถให้แท็กFramelayoutองค์ประกอบandroid:foregroundได้ สิ่งที่แท็กนี้ระบุคือระบุรีซอร์สที่ดึงได้ซึ่งจะถูกจัดเป็นเลเยอร์ไว้ด้านบนของกิจกรรมทั้งหมด (นั่นคือถ้า Framelayout เป็นอิลิเมนต์รูทในไฟล์ xml) จากนั้นคุณสามารถควบคุมความทึบ ( setAlpha()) ของพื้นหน้าที่วาดได้

คุณสามารถใช้ทรัพยากรที่วาดได้ที่คุณต้องการ แต่ถ้าคุณต้องการเพียงแค่เอฟเฟกต์การลดแสงให้สร้างไฟล์ xml ในโฟลเดอร์ที่วาดได้โดยมี<shape>แท็กเป็นรูท

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <solid android:color="#000000" />
</shape>

(ดูhttp://developer.android.com/guide/topics/resources/drawable-resource.html#Shapeสำหรับข้อมูลเพิ่มเติมเกี่ยวกับshapeองค์ประกอบ) โปรดทราบว่าฉันไม่ได้ระบุค่าอัลฟาในแท็กสีที่จะทำให้รายการที่วาดได้โปร่งใส (เช่น #ff000000) เหตุผลนี้ก็คือค่าอัลฟาที่เข้ารหัสดูเหมือนจะแทนที่ค่าอัลฟาใหม่ ๆ ที่เราตั้งค่าผ่านsetAlpha()โค้ดของเราดังนั้นเราจึงไม่ต้องการสิ่งนั้น อย่างไรก็ตามนั่นหมายความว่ารายการที่วาดได้ในขั้นต้นจะเป็นทึบแสง (ทึบไม่โปร่งใส) ดังนั้นเราต้องทำให้onCreate()วิธีการของกิจกรรมโปร่งใส

นี่คือโค้ดองค์ประกอบ Framelayout xml:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainmenu"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:foreground="@drawable/shape_window_dim" >
...
... your activity's content
...
</FrameLayout>

นี่คือวิธี onCreate () ของกิจกรรม:

public void onCreate( Bundle savedInstanceState)
{
  super.onCreate( savedInstanceState);

  setContentView( R.layout.activity_mainmenu);

  //
  // Your own Activity initialization code
  //

  layout_MainMenu = (FrameLayout) findViewById( R.id.mainmenu);
  layout_MainMenu.getForeground().setAlpha( 0);
}

ในที่สุดรหัสเพื่อหรี่กิจกรรม:

layout_MainMenu.getForeground().setAlpha( 220); // dim

layout_MainMenu.getForeground().setAlpha( 0); // restore

ค่าอัลฟาเปลี่ยนจาก0(ทึบแสง) ถึง255(มองไม่เห็น) คุณควรยกเลิกการหรี่แสงกิจกรรมเมื่อคุณปิด Popupwindow

ฉันไม่ได้ใส่รหัสสำหรับแสดงและปิด Popupwindow แต่นี่คือลิงค์สำหรับวิธีการทำได้: http://www.mobilemancer.com/2011/01/08/popup-window-in-android/


เพื่อให้แน่ใจว่าสิ่งนี้ใช้งานได้กับอุปกรณ์รุ่นเก่าคุณต้องยกเลิกการใช้งานเบื้องหน้าหลังจากทำการเปลี่ยนแปลงช่องอัลฟาทุกครั้ง ฉันเพิ่มสิ่งนี้ในคำตอบ +1 สำหรับคำตอบที่ดี
user2224350

1
ฉันคิดไม่ออกว่าเหตุผลใดที่สิ่งนี้ไม่ได้ระบุว่าเป็นคำตอบที่ถูกต้อง .. คำตอบที่ยอดเยี่ยมที่ต้องพูดน้อยที่สุด
เจย์ชิลเดฟ

2
ในมุมมองมี Actionbar คุณไม่สามารถหรี่ได้
BaDo

สิ่งนี้ได้ผลดีที่สุดสำหรับฉัน ... คำตอบป๊อปอัปสองครั้งด้านล่างมีเงื่อนไขการแข่งขันดังนั้นบางครั้งป๊อปอัปสีจางจึงอยู่เหนือป๊อปอัปจริง
kenyee

1
เกือบจะสมบูรณ์แบบ. ข้อเสียเปรียบเพียงประการเดียวคือคุณต้องใช้ FrameLayout เนื่องจากไม่มีเมธอด "getForeground" สำหรับเลย์เอาต์อื่น ๆ
LiangWang

81

ตั้งแต่ PopupWindowเพียงแค่เพิ่มViewการWindowManagerที่คุณสามารถใช้updateViewLayout (View view, ViewGroup.LayoutParams params)ในการปรับปรุงLayoutParamsของคุณPopupWindow's contentViewหลังจากเรียกการแสดง .. ()

การตั้งค่าแฟFLAG_DIM_BEHINDล็กหน้าต่างจะทำให้ทุกอย่างมืดลงด้านหลังหน้าต่าง ใช้dimAmountเพื่อควบคุมปริมาณการหรี่แสง (1.0 สำหรับทึบแสงทั้งหมดถึง 0.0 หากไม่มีแสงสลัว)

โปรดทราบว่าหากคุณตั้งค่าพื้นหลังของคุณPopupWindowจะเป็นการใส่contentViewลงในคอนเทนเนอร์ซึ่งหมายความว่าคุณต้องอัปเดตเป็นระดับบนสุด

พร้อมพื้นหลัง:

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

View container = (View) popup.getContentView().getParent();
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams p = (WindowManager.LayoutParams) container.getLayoutParams();
// add flag
p.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
p.dimAmount = 0.3f;
wm.updateViewLayout(container, p);

ไม่มีพื้นหลัง:

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();
// add flag
p.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
p.dimAmount = 0.3f;
wm.updateViewLayout(contentView, p);

อัพเดต Marshmallow:

บน M PopupWindow จะรวม contentView ไว้ใน FrameLayout ที่เรียกว่า mDecorView หากคุณขุดลงไปในแหล่งที่มา PopupWindow คุณจะพบสิ่งที่ต้องการcreateDecorView(View contentView)จุดประสงค์หลักของ mDecorView คือจัดการการจัดส่งเหตุการณ์และการเปลี่ยนเนื้อหาซึ่งเป็นสิ่งใหม่สำหรับ M ซึ่งหมายความว่าเราต้องเพิ่ม. getParent () อีกหนึ่งรายการเพื่อเข้าถึงคอนเทนเนอร์

ด้วยพื้นหลังที่จะต้องมีการเปลี่ยนแปลงสิ่งที่ต้องการ:

View container = (View) popup.getContentView().getParent().getParent();

ทางเลือกที่ดีกว่าสำหรับ API 18+

โซลูชันที่แฮ็กน้อยโดยใช้ ViewGroupOverlay :

1) รับเค้าโครงรูทที่ต้องการ

ViewGroup root = (ViewGroup) getWindow().getDecorView().getRootView();

2) โทรapplyDim(root, 0.5f);หรือclearDim()

public static void applyDim(@NonNull ViewGroup parent, float dimAmount){
    Drawable dim = new ColorDrawable(Color.BLACK);
    dim.setBounds(0, 0, parent.getWidth(), parent.getHeight());
    dim.setAlpha((int) (255 * dimAmount));

    ViewGroupOverlay overlay = parent.getOverlay();
    overlay.add(dim);
}

public static void clearDim(@NonNull ViewGroup parent) {
    ViewGroupOverlay overlay = parent.getOverlay();
    overlay.clear();
}

2
ดูเหมือนว่าจะใช้ไม่ได้กับอุปกรณ์ที่ใช้ Android 6.0 Marshmallow อีกต่อไป layoutParams WindowManager.LayoutParamsไม่โยนไป มีวิธีแก้ปัญหาหรือไม่?
Robert

ขอบคุณที่ชี้ให้เห็น ฉันยังไม่ได้ทดสอบบน M จะอัปเดต ASAP
Markus Rubey

@ stackoverflow.com/users/308153/robertฉันก็มีปัญหาเดียวกัน ฉันใช้โค้ดด้านบนพร้อมพื้นหลัง
Rizwan Sohaib

ถ้า p เป็นโมฆะให้ใช้สิ่งนี้:if (p != null) { //same } else { popupView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { v.removeOnLayoutChangeListener(this); WindowManager.LayoutParams p = (WindowManager.LayoutParams) v.getLayoutParams(); p.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND; p.dimAmount = 0.3f; wm.updateViewLayout(v, p); } }); }
Beytan Kurt

1
FYI เมื่อฉันใช้สิ่งนี้ในระดับ API ที่ต่ำกว่า (เช่น 15 และ 20) มันขัดข้องเนื่องจาก popup.getContentView () getParent () ไม่ส่งคืน View ดังนั้นการส่งจะทำให้เกิดปัญหา สำหรับกรณีนี้ฉันใช้วิธีของ @ BeytanKurt เป็นทางเลือก
Matthew Horst

30

ในไฟล์ xml ของคุณให้เพิ่มค่าความกว้างและความสูงเป็น "match_parent"

<RelativeLayout
        android:id="@+id/bac_dim_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#C0000000"
        android:visibility="gone" >
</RelativeLayout>

ในกิจกรรมของคุณสร้างขึ้น

//setting background dim when showing popup
back_dim_layout = (RelativeLayout) findViewById(R.id.share_bac_dim_layout);

สุดท้ายให้มองเห็นได้เมื่อคุณแสดงหน้าต่างป๊อปอัปของคุณและทำให้มองเห็นได้หายไปเมื่อคุณออกจากหน้าต่างป๊อปอัป

back_dim_layout.setVisibility(View.VISIBLE);
back_dim_layout.setVisibility(View.GONE);

1
โปรดอย่าทิ้งลายเซ็นเช่น "Thanks, Rupesh" ไว้ในโพสต์
Simon Hellinger

3
แต่จะไม่ทำให้แถบการกระทำ / เครื่องมือหรี่ลง
Silvia H

โปรดบอกวิธีการดำเนินการแถบเครื่องมือสลัว
SAndroidD

1
เพิ่ม back_dim_layout.setVisibility (View.GONE); ใน PopupWindow.ODismissListener
Pulkit

ช่วยฉันได้แน่นอน
Pixxu Waku

12

เคล็ดลับอีกประการหนึ่งคือการใช้หน้าต่างป๊อปอัป 2 หน้าต่างแทนหน้าต่างเดียว หน้าต่างป๊อปอัปที่ 1 จะเป็นเพียงมุมมองจำลองที่มีพื้นหลังโปร่งแสงซึ่งให้เอฟเฟกต์สลัว หน้าต่างป๊อปอัปที่ 2 คือหน้าต่างป๊อปอัปที่คุณตั้งใจไว้

ลำดับขณะสร้างหน้าต่างป๊อปอัป: แสดงหน้าต่างป๊อปอัปจำลองที่ 1 จากนั้นหน้าต่างป๊อปอัปที่ต้องการ

ลำดับขณะทำลาย: ปิดหน้าต่างป๊อปอัปที่ตั้งใจไว้จากนั้นหน้าต่างดัมมี่ป๊อปอัป

วิธีที่ดีที่สุดในการเชื่อมโยงทั้งสองนี้คือการเพิ่มOnDismissListenerและแทนที่onDismiss()วิธีการที่ตั้งใจจะลดขนาดหน้าต่างป๊อปอัปจำลองจากพวกเขา

รหัสสำหรับหน้าต่างป๊อปอัพจำลอง:

fadepopup.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:id="@+id/fadePopup"
    android:background="#AA000000">
</LinearLayout>

แสดงป๊อปอัปจางเพื่อหรี่พื้นหลัง

private PopupWindow dimBackground() {

    LayoutInflater inflater = (LayoutInflater) EPGGRIDActivity.this
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final View layout = inflater.inflate(R.layout.fadepopup,
            (ViewGroup) findViewById(R.id.fadePopup));
    PopupWindow fadePopup = new PopupWindow(layout, windowWidth, windowHeight, false);
    fadePopup.showAtLocation(layout, Gravity.NO_GRAVITY, 0, 0);
    return fadePopup;
}

เกือบจะใช้ได้สำหรับฉัน ... บางครั้งมีสภาวะการแข่งขันที่หน้าต่างป๊อปอัปอยู่ด้านหลังหน้าต่างป๊อปอัปสลัว / ดัมมี่ ยังไม่พบวิธีแก้ปัญหา ... แม้แต่การเลื่อนการแสดงหน้าต่างป๊อปอัปเพื่อให้เวลาอยู่เบื้องหลังอันที่ล่าช้าก็ไม่ได้ช่วยอะไร :-P
kenyee

2
@kenyee ฉันพบวิธีแก้ไขสำหรับปัญหานี้แล้ว ฉันแสดงป๊อปอัป 'จาง' ก่อนจากนั้นเพื่อแสดงป๊อปอัปที่สองฉันใช้ myFadePopup.getContentView () โพสต์ (... myPopup.showAtLocation ... );
Piotr

5

ฉันพบวิธีแก้ปัญหานี้แล้ว

สร้างกล่องโต้ตอบโปร่งใสที่กำหนดเองและภายในกล่องโต้ตอบนั้นให้เปิดหน้าต่างป๊อปอัป:

dialog = new Dialog(context, android.R.style.Theme_Translucent_NoTitleBar);
emptyDialog = LayoutInflater.from(context).inflate(R.layout.empty, null);

/* blur background*/
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();  
lp.dimAmount=0.0f;  
dialog.getWindow().setAttributes(lp);  
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND); 
dialog.setContentView(emptyDialog);
dialog.setCanceledOnTouchOutside(true);
dialog.setOnShowListener(new OnShowListener()
{
    @Override
    public void onShow(DialogInterface dialogIx)
    {
        mQuickAction.show(emptyDialog); //open the PopupWindow here
    }
});
dialog.show();

xml สำหรับกล่องโต้ตอบ (Rlayout.empty):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_height="match_parent" android:layout_width="match_parent"
     style="@android:style/Theme.Translucent.NoTitleBar" />

ตอนนี้คุณต้องการปิดกล่องโต้ตอบเมื่อปิดหน้าต่างป๊อปอัป ดังนั้น

mQuickAction.setOnDismissListener(new OnDismissListener()
{
    @Override
    public void onDismiss()
    {
        if(dialog!=null)
        {
            dialog.dismiss(); // dismiss the empty dialog when the PopupWindow closes
            dialog = null;
        }
    }
});

หมายเหตุ: ฉันเคยใช้NewQuickActionปลั๊กอินสำหรับสร้าง PopupWindow ที่นี่ นอกจากนี้ยังสามารถทำได้บน Windows Popup ดั้งเดิม


1

สำหรับฉันคำตอบของ Abdelhak Mouaamou ใช้งานได้จริงทดสอบกับ API ระดับ 16 และ 27

แทนที่จะใช้popupWindow.getContentView().getParent()และส่งผลลัพธ์เป็นView(ซึ่งขัดข้องในระดับ API 16 ทำให้มีการส่งคืนViewRootImplวัตถุที่ไม่ใช่อินสแตนซ์View) ฉันใช้.getRootView()สิ่งที่ส่งคืนมุมมองแล้วดังนั้นจึงไม่จำเป็นต้องมีการแคสต์ที่นั่น

หวังว่าจะช่วยใครสักคน :)

ตัวอย่างการทำงานที่สมบูรณ์มีสัญญาณรบกวนร่วมกันจากโพสต์ stackoverflow อื่น ๆ เพียงแค่คัดลอกและวางเช่นในฟังก์ชั่น onClick ของปุ่ม:

// inflate the layout of the popup window
LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
if(inflater == null) {
    return;
}
//View popupView = inflater.inflate(R.layout.my_popup_layout, null); // this version gives a warning cause it doesn't like null as argument for the viewRoot, c.f. /programming/24832497 and /programming/26404951
View popupView = View.inflate(MyParentActivity.this, R.layout.my_popup_layout, null);

// create the popup window
final PopupWindow popupWindow = new PopupWindow(popupView,
        LinearLayout.LayoutParams.WRAP_CONTENT,
        LinearLayout.LayoutParams.WRAP_CONTENT,
        true // lets taps outside the popup also dismiss it
        );

// do something with the stuff in your popup layout, e.g.:
//((TextView)popupView.findViewById(R.id.textview_popup_helloworld))
//      .setText("hello stackoverflow");

// dismiss the popup window when touched
popupView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            popupWindow.dismiss();
            return true;
        }
});

// show the popup window
// which view you pass in doesn't matter, it is only used for the window token
popupWindow.showAtLocation(view, Gravity.CENTER, 0, 0);
//popupWindow.setOutsideTouchable(false); // doesn't seem to change anything for me

View container = popupWindow.getContentView().getRootView();
if(container != null) {
    WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
    WindowManager.LayoutParams p = (WindowManager.LayoutParams)container.getLayoutParams();
    p.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND;
    p.dimAmount = 0.3f;
    if(wm != null) {
        wm.updateViewLayout(container, p);
    }
}

1
findViewById(R.id.drawer_layout).setAlpha((float) 0.7);

R.id.drawer_layout คือรหัสของเค้าโครงที่คุณต้องการหรี่ความสว่าง


0

คุณสามารถใช้android:theme="@android:style/Theme.Dialog"เพื่อทำเช่นนั้น สร้างกิจกรรมและAndroidManifest.xmlกำหนดกิจกรรมเป็น:

    <activity android:name=".activities.YourActivity"
              android:label="@string/your_activity_label"
              android:theme="@android:style/Theme.Dialog">

ดูเหมือนจะไม่ได้ผล ฉันใช้สิ่งนี้กับกิจกรรมเดียวของฉันซึ่งอยู่เบื้องหลังเมื่อฉันแสดงหน้าต่างป๊อปอัปซึ่งเป็นเพียงเลย์เอาต์ที่สูงเกินจริงที่ฉันมีไม่ใช่กิจกรรมแยกต่างหาก ฉันจะใช้ FLAG_BLUR_BEHIND กับ PopupWindow ได้อย่างไร
k_day

0

ตกลงดังนั้นฉันจึงทำตามคำตอบของ uhmdownสำหรับกิจกรรมพื้นหลังลดแสงเมื่อหน้าต่างป๊อปเปิดอยู่ แต่มันสร้างปัญหาให้ฉัน เป็นกิจกรรมลดแสงและรวมหน้าต่างป๊อปอัป (หมายถึงชั้นสีดำ - ดำที่มีทั้งกิจกรรมและป๊อปอัปด้วยซึ่งไม่สามารถแยกออกจากกันได้)

ฉันจึงลองวิธีนี้

สร้างไฟล์dimming_black.xmlสำหรับเอฟเฟกต์การลดแสง

 <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#33000000" />
</shape>

และเพิ่มเป็นbackgroundในFrameLayoutขณะที่แท็กราก XML, ยังใส่การควบคุมอื่น ๆ ของฉันในLinearLayoutเช่นนี้layout.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@drawable/ff_drawable_black">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="bottom"
        android:background="@color/white">

        // other codes...
    </LinearLayout>

</FrameLayout>

ในที่สุดฉันจะแสดงป๊อปอัปบนของฉันMainActivityพร้อมกับพารามิเตอร์พิเศษบางอย่างที่กำหนดไว้ด้านล่าง

           //instantiate popup window
            popupWindow = new PopupWindow(viewPopup, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, true);

            //display the popup window
            popupWindow.showAtLocation(layout_ff, Gravity.BOTTOM, 0, 0);

ผลลัพธ์: ใส่คำอธิบายภาพที่นี่

การทำงานสำหรับฉันยังแก้ปัญหาเป็นความเห็นโดยBado Actionbarนอกจากนี้ยังสามารถหรี่ได้

Ps ฉันไม่ได้บอกว่าuhmdownผิด ฉันเรียนรู้จากคำตอบของเขาและพยายามที่จะพัฒนาเพื่อแก้ปัญหาของฉัน ฉันยังสับสนว่านี่เป็นวิธีที่ดีหรือไม่

ข้อเสนอแนะใด ๆ นอกจากนี้ยังขอขอบคุณสำหรับภาษาอังกฤษที่ไม่ดีของฉัน


0

บางที repo นี้จะช่วยคุณได้: BasePopup

นี่คือ repo ของฉันซึ่งใช้เพื่อแก้ปัญหาต่างๆของ PopupWindow

ในกรณีที่ใช้ไลบรารีหากต้องการเบลอพื้นหลังเพียงโทร setBlurBackgroundEnable(true).

ดูวิกิสำหรับรายละเอียดเพิ่มเติม (ภาษาใน zh-cn)

BasePopup: วิกิพีเดีย


-1

รหัสนี้ใช้งานได้

        pwindo = new PopupWindow(layout, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
        pwindo.showAtLocation(layout, Gravity.CENTER, 0, 0);
        pwindo.setOutsideTouchable(false);

        View container = (View) pwindo.getContentView().getParent();
        WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        WindowManager.LayoutParams p = (WindowManager.LayoutParams) container.getLayoutParams();
        p.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND;
        p.dimAmount = 0.3f;
        wm.updateViewLayout(container, p);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.