จะสร้างข้อความแจ้งเตือนเติมเต็มขนาดหน้าจอ 90% ได้อย่างไร


305

ฉันสามารถสร้างและแสดงข้อความโต้ตอบการแจ้งเตือนที่กำหนดเองได้ดี แต่ฉันก็มีเช่นกัน android:layout_width/height="fill_parent"ในกล่องโต้ตอบ xml มันมีขนาดใหญ่เท่ากับเนื้อหา

สิ่งที่ฉันต้องการคือกล่องโต้ตอบที่เติมเต็มทั้งหน้าจอยกเว้นอาจมีช่องว่างภายใน 20 พิกเซล จากนั้นอิมเมจที่เป็นส่วนหนึ่งของไดอะล็อกจะขยายให้เต็มขนาดไดอะล็อกโดยอัตโนมัติด้วย fill_parent

คำตอบ:


355

ตามที่นักพัฒนาซอฟต์แวร์ Android แพลตฟอร์ม Dianne Hackborn ในนี้WRAP_CONTENTสนทนากลุ่มโพสต์โต้ตอบกำหนดความกว้างรูปแบบระดับบนสุดของหน้าต่างของพวกเขาและความสูง เพื่อให้ไดอะล็อกใหญ่ขึ้นคุณสามารถตั้งค่าพารามิเตอร์เหล่านั้นเป็นMATCH_PARENTเพื่อให้การโต้ตอบใหญ่คุณสามารถตั้งค่าพารามิเตอร์เหล่านั้นไป

รหัสตัวอย่าง:

    AlertDialog.Builder adb = new AlertDialog.Builder(this);
    Dialog d = adb.setView(new View(this)).create();
    // (That new View is just there to have something inside the dialog that can grow big enough to cover the whole screen.)

    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
    lp.copyFrom(d.getWindow().getAttributes());
    lp.width = WindowManager.LayoutParams.MATCH_PARENT;
    lp.height = WindowManager.LayoutParams.MATCH_PARENT;
    d.show();
    d.getWindow().setAttributes(lp);

โปรดทราบว่าแอตทริบิวต์ถูกตั้งค่าหลังจากไดอะล็อกถูกแสดง ระบบจะพิถีพิถันเกี่ยวกับเมื่อพวกเขาตั้ง (ฉันเดาว่าเครื่องมือการจัดวางจะต้องตั้งค่าในครั้งแรกที่มีการแสดงข้อความหรือบางสิ่ง)

มันจะเป็นการดีกว่าถ้าคุณทำสิ่งนี้โดยการขยาย Theme.Dialog จากนั้นคุณไม่ต้องเล่นเกมที่คาดเดาว่าจะเรียก setAttributes เมื่อใด (แม้ว่าจะเป็นงานอีกเล็กน้อยที่จะให้กล่องโต้ตอบใช้ชุดรูปแบบแสงหรือสีเข้มที่เหมาะสมโดยอัตโนมัติหรือชุดรูปแบบ Honeycomb Holo ซึ่งสามารถทำได้ตามhttp://developer.android.com/guide/topics/ui/themes html # SelectATheme )


5
ไม่ว่าฉันจะไม่เข้าใจคำตอบหรือไม่ได้ผลสำหรับฉัน
David Morales

4
ดูเหมือนจะไม่เป็นความจริงเลยที่กล่องโต้ตอบนั้นกว้างทั้ง wrap_content ทุกอย่างแคบลงและถูกตัดออกไป ดูเหมือนว่ากล่องโต้ตอบจะถูกตั้งค่าความกว้างสูงสุดที่กำหนดไว้ล่วงหน้า
ปีเตอร์ Ajtai

21
ฉันไม่เข้าใจวิธีนี้ตอบคำถามหรือไม่ รหัสที่แนะนำโดย @nmr ทำให้ไดอะล็อกเป็น 90% ของหน้าจอหรือไม่ เพราะฉันไม่เห็นมัน ไดอะล็อกถูกตั้งค่าเป็น fill_width ดังนั้นนั่นคือ 100% ไม่ใช่ 90% ใช่ไหม
เท็ด

4
@Ted ชุดรูปแบบที่ใช้โดย AlertDialog มีส่วนต่าง ดังนั้นผลลัพธ์ไม่ถึงขอบของหน้าจอมันจะเติมประมาณ 90% ของหน้าจอ (มันไม่แน่นอน 90% เพียงแค่ประมาณความสวยงาม 90%)
nmr

8
เพียงแค่เรียก d.getWindow (). getAttributes (). width = WindowManager.LayoutParams.FILL_PARENT; ก่อนที่จะเรียก show () จะทำการหลอกลวง นอกจากนี้ฉันเคยมีปัญหาบางอย่างกับวิธีการที่กำหนดเนื่องจากพื้นหลังของกล่องโต้ตอบไม่โปร่งใส ทันทีที่คัดลอก copyFrom (() ออกปัญหาได้แก้ไขเอง
Alexey

183

ลองตัดรูปแบบโต้ตอบของคุณกำหนดเองลงแทนRelativeLayout LinearLayoutที่ทำงานให้ฉัน


2
มันมีให้ฉันเช่นกัน ใครช่วยอธิบายเหตุผลได้บ้าง !!
Rozina

นี่เป็นวิธีที่ RelativeLayout ควรทำงานหรือเกิดอุบัติเหตุที่มีความสุขที่หายไปได้หรือไม่?
Yetti99

10
มันคือปี 2019 และยังใช้งานได้ ไชโย! ควรเป็นคำตอบที่ยอมรับได้แน่นอน
TaylanUB

@cvarsendan คุณช่วยอธิบายคำตอบได้ไหม? ที่ทำงานให้ฉัน ขอบคุณ!
Jaco

OMG, My RecyclerView ไม่เคยแสดงความสูงเต็มหรือสูงเสมอ 0 แล้วมันจะทำงานได้อย่างสมบูรณ์แบบหลังจากพยายามแก้ปัญหาหลายวัน ทำไม RelativeLayout แต่เป็นอื่น ๆ
ปกครอง

85

การระบุ FILL_PARENT บนหน้าต่างข้อความเช่นเดียวกับที่คนอื่นแนะนำไม่ได้ผลสำหรับฉัน (บน Android 4.0.4) เพราะมันเพิ่งขยายพื้นหลังกล่องโต้ตอบสีดำเพื่อให้เต็มหน้าจอ

สิ่งที่ใช้ได้ผลดีคือการใช้ค่าการแสดงผลขั้นต่ำ แต่ระบุไว้ในรหัสเพื่อให้กล่องโต้ตอบใช้ 90% ของหน้าจอ

ดังนั้น:

Activity activity = ...;
AlertDialog dialog = ...;

// retrieve display dimensions
Rect displayRectangle = new Rect();
Window window = activity.getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle);

// inflate and adjust layout
LayoutInflater inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.your_dialog_layout, null);
layout.setMinimumWidth((int)(displayRectangle.width() * 0.9f));
layout.setMinimumHeight((int)(displayRectangle.height() * 0.9f));

dialog.setView(layout);

โดยทั่วไปแล้วการปรับความกว้างควรเพียงพอในกรณีส่วนใหญ่


ดูเหมือนว่าจะใช้งานไม่ได้ใน 4.0 และสูงกว่า มันไม่ได้เติมเต็ม 90% ของหน้าจอ มีความคิดอะไรไหม? ฉันกำลังทำสิ่งนี้กับ Motorola Xoom กับ 4.0
Ryan Gray

@RyanGray มันทำงานกับฉันใน Samsung Nexus S พร้อมกับระบบปฏิบัติการที่อัปเดตแล้ว หากไม่มีข้อมูลเพิ่มเติมฉันไม่สามารถช่วยเหลือคุณได้
koma

83

ตั้งค่าandroid:minWidthและandroid:minHeightในมุมมองที่กำหนดเองของคุณ xml สิ่งเหล่านี้สามารถบังคับให้การแจ้งเตือนไม่เพียงแค่ตัดขนาดเนื้อหา การใช้มุมมองเช่นนี้ควรทำ:

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:minWidth="300dp" 
  android:minHeight="400dp">
  <ImageView
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:background="@drawable/icon"/>
</LinearLayout>

3
ใช่ด้วยสิ่งนี้ฉันสามารถตั้งค่าให้มีขนาดเฉพาะ แต่ฉันต้องการให้หน้าจอลบด้วยการเว้นระยะห่างเช่น 20 พิกเซล หรือ width = 90% ของความกว้างหน้าจอ
เฟเบียน

4
ฉันปรับความหนาแน่นของพิกเซลอิสระเสมอเพื่อให้หน้าจอใด ๆ มีขนาด 320x480dp ดังนั้นมุมมอง 300x460dp จะเป็นช่องว่างภายใน 20dp ในทุกกรณี หรือคุณสามารถหาขนาดของหน้าจอดังนี้: Display display = ((WindowManager) getSystemService (Context.WINDOW_SERVICE)) getDefaultDisplay (); int width = display.getWidth (); และตั้งค่า maxWidth และ maxHeight
jqpubliq

5
อืมจากการแยกส่วนฉันเข้าใจแนวคิดของ dp แต่ถ้าอัตราส่วนหน้าจอเท่ากับ 16: 9 หรือ 4: 3 dp ที่ยืดออกจะไม่เท่ากันหรือไม่
เฟเบียน

2
ไม่ความละเอียด dp จะเป็นเพียง 320x480 หากอัตราส่วนหน้าจอเป็น 2: 3 ดังนั้นวิธีนี้จะไม่ทำงาน
mhsmith

21
อะไรทำไมคำตอบนี้จึงขึ้นหลายครั้ง นี่เป็นวิธีการแก้ปัญหาที่แย่มากเนื่องจากไม่ได้คำนึงถึงขนาดอุปกรณ์ที่ผู้ใช้ใช้
Jin

70

ง่ายยิ่งขึ้นเพียงแค่ทำสิ่งนี้:

int width = (int)(getResources().getDisplayMetrics().widthPixels*0.90);
int height = (int)(getResources().getDisplayMetrics().heightPixels*0.90);

alertDialog.getWindow().setLayout(width, height);

หมายเหตุเล็กน้อย: getResources () มีอยู่ในบริบทของกิจกรรม
nat101

คำตอบนี้มีประโยชน์มากสำหรับสถานการณ์ที่พยายามสร้างกล่องโต้ตอบขึ้นใหม่onCreateหลังจากการหมุนอุปกรณ์ ในกรณีนี้เราไม่สามารถพึ่งพาความกว้าง / ความสูงของสิ่งใดก็ได้ในเค้าโครงเนื่องจากยังไม่ได้สร้าง แต่ความกว้าง / ความสูงทางกายภาพของอุปกรณ์ยังคงมีอยู่
Tim Biegeleisen

4
หากคุณต้องการเปลี่ยนเพียงหนึ่งมิติให้ส่งผ่านViewGroup.LayoutParams.WRAP_CONTENTพารามิเตอร์ตัวหนึ่ง
Vadim Kotov

53
dialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);

1
สิ่งนี้ใช้ได้สำหรับฉันและง่ายต่อการแปลเป็น MonoDroid ซึ่งทำงานเช่นนั้น (โดย d เป็นไดอะล็อกใหม่): d.Window.SetLayout (WindowManagerLayoutParams.FillParent, WindowManagerLayoutParams.FillParent);
theJerm

9
แต่ 90% นั้นไม่เหมือนกับ 100% FILL_PARENT จะระบุว่าเติมเต็มความกว้างทั้งหมด 100% ไม่ใช่ 90% ขวา?
เท็ด

@ เท็ดคุณพูดถูก คุณสามารถแทนที่FILL_PARENTด้วยความกว้างที่คำนวณได้เป็น 90% ของความกว้างของจอแสดงผลปัจจุบัน แต่ฉันชอบคำตอบเพราะง่ายกว่าคำตอบอื่น ๆ
HRJ

26

คำตอบอื่น ๆ ทั้งหมดที่นี่สมเหตุสมผล แต่ก็ไม่เป็นไปตามที่เฟเบียนต้องการ นี่คือทางออกของฉัน มันอาจไม่ใช่วิธีที่สมบูรณ์แบบ แต่ใช้ได้สำหรับฉัน มันแสดงให้เห็นกล่องโต้ตอบที่อยู่ในแบบเต็มหน้าจอ แต่คุณสามารถระบุช่องว่างภายในด้านบนด้านล่างซ้ายหรือขวา

ก่อนอื่นให้วางสิ่งนี้ลงใน res / values ​​/ styles.xml ของคุณ:

<style name="CustomDialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@color/Black0Percent</item>
    <item name="android:paddingTop">20dp</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:backgroundDimEnabled">false</item>
    <item name="android:windowIsFloating">false</item>
</style>

อย่างที่คุณเห็นฉันมีAndroid: paddingTop = 20dpนั้นเป็นสิ่งที่คุณต้องการ หุ่นยนต์: windowBackground = @ สี / Black0Percentเป็นเพียงรหัสสีประกาศ color.xml ของฉัน

ความละเอียด / ค่า / color.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="Black0Percent">#00000000</color>
</resources>

รหัสสีนั้นทำหน้าที่เสมือนตัวแทนเพื่อแทนที่พื้นหลังหน้าต่างเริ่มต้นของกล่องโต้ตอบด้วยสีโปร่งใส 0%

ถัดไปสร้างเค้าโครงไดอะล็อกที่กำหนดเอง res / layout / dialog.xml

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

    <EditText
        android:id="@+id/edittext1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:textSize="18dp" />

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Dummy Button"
        android:textSize="18dp" />

</LinearLayout>

สุดท้ายนี่คือกล่องโต้ตอบของเราที่ตั้งค่ามุมมองที่กำหนดเองซึ่งใช้ dialog.xml ของเรา:

Dialog customDialog;
LayoutInflater inflater = (LayoutInflater) getLayoutInflater();
View customView = inflater.inflate(R.layout.dialog, null);
// Build the dialog
customDialog = new Dialog(this, R.style.CustomDialog);
customDialog.setContentView(customView);
customDialog.show();

สรุป:ฉันพยายามแทนที่ธีมของไดอะล็อกในสไตล์.xmlชื่อ CustomDialog มันแทนที่เค้าโครงหน้าต่างไดอะล็อกและให้โอกาสฉันในการตั้งช่องว่างภายในและเปลี่ยนความทึบของพื้นหลัง มันอาจไม่ใช่โซลูชันที่สมบูรณ์แบบ แต่ฉันหวังว่ามันจะช่วยคุณได้ :)


มันใช้งานได้กับ jellybean สำหรับตอนนี้ฉันสามารถทดสอบ bulids อื่นได้แล้ว
Nasz Njoka Sr.

ดูเหมือนทางออกที่สะอาดและสง่างามที่สุด ใช้งานได้กับ Kitkat 4.4 และ 4.3
David

ฉันมีการสนทนาที่กำหนดเองและไม่มีอะไรทำงานจนกว่าฉันจะเห็นสิ่งนี้ความมหัศจรรย์และความมหัศจรรย์ทั้งหมดในการสนทนาที่กำหนดเอง (ที่ขยายDialogFragment) มาเมื่อคุณ: Dialog customDialog = new Dialog(context, STYLE);ขอบคุณจริงๆจริงๆขอบคุณ
Sierisimo


มันใช้งานได้อย่างมีเสน่ห์สำหรับหน้าต่างข้อความ! (คุณยังสามารถกำหนด Black60Percent จะมีหน้าต่างเดิมสีเทา) ผลข้างเคียงที่โชคร้ายก็คือว่ามุมมองของฉันทั้งหมดในกล่องโต้ตอบได้รับมรดก paddings ที่ผมตั้งไว้สำหรับการโต้ตอบ ....
runholen

25

คุณสามารถใช้เปอร์เซ็นต์สำหรับความกว้างหน้าต่างโต้ตอบ (เพียง)

ดูตัวอย่างนี้จาก Holo Theme:

<style name="Theme.Holo.Dialog.NoActionBar.MinWidth">
    <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
    <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
</style>

 <!-- The platform's desired minimum size for a dialog's width when it
     is along the major axis (that is the screen is landscape).  This may
     be either a fraction or a dimension. -->
<item type="dimen" name="dialog_min_width_major">65%</item>

สิ่งที่คุณต้องทำคือขยายชุดรูปแบบนี้และเปลี่ยนค่าสำหรับ "Major" และ "Minor" เป็น 90% แทน 65%

ความนับถือ.


1
ในการใช้สิ่งนี้กับไดอะล็อกเพียงแค่ส่งสไตล์ที่คุณกำหนดเองในตัวสร้างไดอะล็อก :)
sosite

23

การทำงานต่อไปนี้ดีสำหรับฉัน:

    <style name="MyAlertDialogTheme" parent="Base.Theme.AppCompat.Light.Dialog.Alert">
        <item name="windowFixedWidthMajor">90%</item>
        <item name="windowFixedWidthMinor">90%</item>
    </style>

(หมายเหตุ: windowMinWidthMajor / Minor ตามคำแนะนำในคำตอบก่อนหน้านี้ไม่ได้ทำเคล็ดลับกล่องโต้ตอบของฉันยังคงเปลี่ยนขนาดขึ้นอยู่กับเนื้อหา)

แล้ว:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.MyAlertDialogTheme);

4
คำตอบที่ดีที่สุด ทำงานอย่างสมบูรณ์แบบสำหรับฉัน!
Pawan

ฉันสงสัยว่า: ฉันจะรับค่าของมิติข้อมูลพิเศษดังกล่าวซึ่งกำหนดเป็นเปอร์เซ็นต์ด้วยรหัสได้อย่างไร
นักพัฒนา android

19

โซลูชันที่มีการคำนวณ 90% จริง:

@Override public void onStart() {
   Dialog dialog = getDialog();
   if (dialog != null) {
     dialog.getWindow()
        .setLayout((int) (getScreenWidth(getActivity()) * .9), ViewGroup.LayoutParams.MATCH_PARENT);
   }
}

โดยที่getScreenWidth(Activity activity)กำหนดไว้ดังต่อไปนี้ (ควรใส่ไว้ในคลาส Utils):

public static int getScreenWidth(Activity activity) {
   Point size = new Point();
   activity.getWindowManager().getDefaultDisplay().getSize(size);
   return size.x;
}

ใช้งานได้อย่างมีเสน่ห์สำหรับแอพขนาดกะทัดรัดที่ควรทำงานเหมือนไดอะล็อก

ฉันได้รับดัชนีแถวลำดับจากนี้ :(
ดร. aNdRO

@ Dr.aNdRO อย่างไร สายไหน คุณแน่ใจหรือว่ามันเป็นโค้ดชิ้นนี้และไม่ใช่อีกชิ้น
เมห์เม็ต K

.setLayout () ฉันได้รับที่บรรทัดนี้เมื่อฉันเปลี่ยนเป็น WRAP เนื้อหานี้ทำงานได้ดี
ดร. aNdRO

ดูเพิ่มเติมที่: stackoverflow.com/questions/36777584/…
Mr-IDE

10

รับความกว้างของอุปกรณ์:

public static int getWidth(Context context) {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    WindowManager windowmanager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    windowmanager.getDefaultDisplay().getMetrics(displayMetrics);
    return displayMetrics.widthPixels;
}

จากนั้นใช้สิ่งนั้นเพื่อสร้างกล่องโต้ตอบ 90% ของอุปกรณ์

Dialog filterDialog = new Dialog(context, R.style.searchsdk_FilterDialog);

filterDialog.setContentView(R.layout.searchsdk_filter_popup);
initFilterDialog(filterDialog);
filterDialog.setCancelable(true);
filterDialog.getWindow().setLayout(((getWidth(context) / 100) * 90), LinearLayout.LayoutParams.MATCH_PARENT);
filterDialog.getWindow().setGravity(Gravity.END);
filterDialog.show();

8

คุณต้องตั้งค่าความสูงและความกว้างของกล่องโต้ตอบก่อนที่จะแสดงสิ่งนี้ (dialog.show ())

ดังนั้นทำสิ่งนี้:

dialog.getWindow().setLayout(width, height);

//then

dialog.show()

ไม่ได้กำหนดขนาดสำหรับฉัน API> = 21.
Odys

7

วิธีที่ง่ายที่สุดที่ฉันคิดได้ -

หากไดอะล็อกของคุณทำจาก LinearLayout แนวตั้งเพียงเพิ่มมุมมองดัมมี่ "เติมเต็มความสูง" ซึ่งจะครอบครองความสูงทั้งหมดของหน้าจอ

ตัวอย่างเช่น -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:weightSum="1">

    <EditText
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:id="@+id/editSearch" />

    <ListView
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:id="@+id/listView"/>


   <!-- this is a dummy view that will make sure the dialog is highest -->
   <View
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:layout_weight="1"/>

</LinearLayout>

สังเกตเห็นandroid:weightSum="1"ในแอตทริบิวต์ของ LinearLayout และandroid:layout_weight="1"ในคุณสมบัติของมุมมองแบบจำลอง


ดี! สิ่งนี้ทำให้มุมมองเว็บของฉันไม่เริ่มต้นสั้นมากและขยายให้เต็มความสูงหลังจาก onPageFinished รุ่งโรจน์!
แนนซี่

6

คุณต้องตั้งค่าความสูงและความกว้างของกล่องโต้ตอบก่อนที่จะแสดงสิ่งนี้ (dialog.show ())

ดังนั้นทำสิ่งนี้:

dialog.getWindow().setLayout(width, height);

//then

dialog.show()

รับรหัสนี้ฉันได้ทำการเปลี่ยนแปลงบางอย่าง:

dialog.getWindow().setLayout((int)(MapGeaGtaxiActivity.this.getWindow().peekDecorView().getWidth()*0.9),(int) (MapGeaGtaxiActivity.this.getWindow().peekDecorView().getHeight()*0.9));

อย่างไรก็ตามขนาดโต้ตอบอาจเปลี่ยนแปลงได้เมื่ออุปกรณ์เปลี่ยนตำแหน่ง บางทีคุณอาจต้องจัดการด้วยตัวเองเมื่อการเปลี่ยนแปลงของตัวชี้วัด PD: peekDecorView แสดงว่าเลย์เอาต์ในกิจกรรมนั้นเริ่มต้นอย่างถูกต้องไม่เช่นนั้นคุณอาจใช้

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int wwidth = metrics.widthPixels;

เพื่อให้ได้ขนาดหน้าจอ


6

หลังจากเริ่มต้นวัตถุโต้ตอบของคุณและตั้งค่ามุมมองเนื้อหา ทำสิ่งนี้และสนุกกับ

(ในกรณีที่ฉันตั้งค่า 90% เป็นความกว้างและ 70% เป็นความสูงเนื่องจากความกว้าง 90% จะอยู่เหนือแถบเครื่องมือ)

DisplayMetrics displaymetrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int width = (int) ((int)displaymetrics.widthPixels * 0.9);
int height = (int) ((int)displaymetrics.heightPixels * 0.7);
d.getWindow().setLayout(width,height);
d.show();

4

คำตอบของฉันขึ้นอยู่กับ koma แต่ไม่จำเป็นต้องแทนที่ onStart แต่เฉพาะ onCreateView ซึ่งมักจะถูกแทนที่โดยค่าเริ่มต้นเมื่อคุณสร้างแฟรกเมนต์ใหม่

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.your_fragment_layout, container);

    Rect displayRectangle = new Rect();
    Window window = getDialog().getWindow();
    window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle);

    v.setMinimumWidth((int)(displayRectangle.width() * 0.9f));
    v.setMinimumHeight((int)(displayRectangle.height() * 0.9f));

    return v;
}

ฉันทดสอบกับ Android 5.0.1 แล้ว


3

นี่คือตัวแปรของฉันสำหรับความกว้างของกล่องโต้ตอบที่กำหนดเอง:

DisplayMetrics displaymetrics = new DisplayMetrics();
mActivity.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int width = (int) (displaymetrics.widthPixels * (ThemeHelper.isPortrait(mContext) ? 0.95 : 0.65));

WindowManager.LayoutParams params = getWindow().getAttributes();
params.width = width;
getWindow().setAttributes(params);

ดังนั้นขึ้นอยู่กับการวางแนวอุปกรณ์ (ThemeHelper.isPortrait(mContext) ) ความกว้างของกล่องโต้ตอบจะเป็น 95% (สำหรับโหมดแนวตั้ง) หรือ 65% (สำหรับแนวนอน) มันเพิ่มเติมเล็กน้อยที่ผู้เขียนถาม แต่อาจเป็นประโยชน์กับใครบางคน

คุณต้องสร้างคลาสที่ขยายจาก Dialog และใส่รหัสนี้ในonCreate(Bundle savedInstanceState)วิธีการของคุณ

สำหรับความสูงของไดอะล็อกรหัสควรคล้ายกับสิ่งนี้


คือThemeHelperอะไร ฉันไม่มีคลาสนี้ในโครงการของฉัน
Nemi

ThemeHelperเป็นเพียงชั้นผู้ช่วยสำหรับความต้องการของฉัน วิธีการของมันisPortrait(Context)จะคืนค่าว่าการวางแนวหน้าจอของอุปกรณ์เป็นแนวตั้งหรือแนวนอน
แคลน

สิ่งนี้จะมีปัญหาหากกล่องโต้ตอบถูกโหลดขึ้นมาและจากนั้นเราเปลี่ยนการวางแนวมันจะคงการตั้งค่าเริ่มต้นไว้ใน onCreate
iBabur

3
public static WindowManager.LayoutParams setDialogLayoutParams(Activity activity, Dialog dialog)
    {
        try 
        {
            Display display = activity.getWindowManager().getDefaultDisplay();
            Point screenSize = new Point();
            display.getSize(screenSize);
            int width = screenSize.x;

            WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
            layoutParams.copyFrom(dialog.getWindow().getAttributes());
            layoutParams.width = (int) (width - (width * 0.07) ); 
            layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
            return layoutParams;
        } 
        catch (Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }

3

เหนือคำตอบหลายคำตอบก็ดี แต่ก็ไม่ได้ผลเต็มที่สำหรับฉัน ดังนั้นฉันรวมคำตอบจาก @nmr และได้หนึ่งนี้

final Dialog d = new Dialog(getActivity());
        //  d.getWindow().setBackgroundDrawable(R.color.action_bar_bg);
        d.requestWindowFeature(Window.FEATURE_NO_TITLE);
        d.setContentView(R.layout.dialog_box_shipment_detail);

        WindowManager wm = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE); // for activity use context instead of getActivity()
        Display display = wm.getDefaultDisplay(); // getting the screen size of device
        Point size = new Point();
        display.getSize(size);
        int width = size.x - 20;  // Set your heights
        int height = size.y - 80; // set your widths

        WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
        lp.copyFrom(d.getWindow().getAttributes());

        lp.width = width;
        lp.height = height;

        d.getWindow().setAttributes(lp);
        d.show();

3
    ...
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    Dialog d = builder.create(); //create Dialog
    d.show(); //first show

    DisplayMetrics metrics = new DisplayMetrics(); //get metrics of screen
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
    int height = (int) (metrics.heightPixels*0.9); //set height to 90% of total
    int width = (int) (metrics.widthPixels*0.9); //set width to 90% of total

    d.getWindow().setLayout(width, height); //set layout

3
การแสดงข้อความโต้ตอบก่อนที่การตั้งค่าเค้าโครงจะทำงานสำหรับฉัน
Angel Koh

2

คุณต้องใช้ style @ style.xml เช่น CustomDialog เพื่อแสดงไดอะล็อกที่ปรับแต่งได้

<style name="CustomDialog" parent="@android:style/Theme.DeviceDefault.Light.Dialog">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@color/colorWhite</item>
        <item name="android:editTextColor">@color/colorBlack</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    </style>

และใช้สไตล์นี้ใน Activity.java แบบนี้

Dialog dialog= new Dialog(Activity.this, R.style.CustomDialog);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.custom_dialog);

และ custom_dialog.xml ของคุณควรอยู่ในไดเรกทอรีเค้าโครงของคุณ

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="10dp"
    android:paddingRight="10dp">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="20dp"
        android:id="@+id/tittle_text_view"
        android:textColor="@color/colorBlack"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="10dp"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginLeft="20dp"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="20dp"
        android:layout_marginRight="20dp">

        <EditText
            android:id="@+id/edit_text_first"
            android:layout_width="50dp"
            android:layout_height="match_parent"
            android:hint="0"
            android:inputType="number" />

        <TextView
            android:id="@+id/text_view_first"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="5dp"
            android:gravity="center"/>

        <EditText
            android:id="@+id/edit_text_second"
            android:layout_width="50dp"
            android:layout_height="match_parent"
            android:hint="0"
            android:layout_marginLeft="5dp"
            android:inputType="number" />

        <TextView
            android:id="@+id/text_view_second"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="5dp"
            android:gravity="center"/>

    </LinearLayout>

</LinearLayout>

2

หากคุณกำลังใช้เค้าโครงข้อ จำกัดคุณสามารถตั้งค่ามุมมองใด ๆ ภายในเพื่อเติมเปอร์เซ็นต์ของหน้าจอด้วย:

layout_constraintWidth_percent = "0.8"

ตัวอย่างเช่นหากคุณมี ScrollView ภายในกล่องโต้ตอบและคุณต้องการตั้งค่าเป็นเปอร์เซ็นต์ของความสูงของหน้าจอ มันจะเป็นเช่นนี้:

<ScrollView
            android:id="@+id/scrollView"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintHeight_percent="0.8">

หวังว่ามันจะช่วยให้ใครบางคน !!


2

เพียงแค่ให้ AlertDialog ชุดรูปแบบนี้

<style name="DialogTheme" parent="Theme.MaterialComponents.Light.Dialog.MinWidth">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="android:windowMinWidthMajor">90%</item>
    <item name="android:windowMinWidthMinor">90%</item>
</style>

1

นี่คือคำตอบสั้น ๆ ที่ใช้ได้สำหรับฉัน (ทดสอบกับ API 8 และ API 19)

Dialog mDialog;
View   mDialogView;
...
// Get height
int height = mDialog.getWindow()
.getWindowManager().getDefaultDisplay()
.getHeight();

// Set your desired padding (here 90%)
int padding = height - (int)(height*0.9f);

// Apply it to the Dialog
mDialogView.setPadding(
// padding left
0,
// padding top (90%)
padding, 
// padding right
0, 
// padding bottom (90%)
padding);


0
    final AlertDialog alertDialog;

    LayoutInflater li = LayoutInflater.from(mActivity);
    final View promptsView = li.inflate(R.layout.layout_dialog_select_time, null);

    RecyclerView recyclerViewTime;
    RippleButton buttonDone;

    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(mActivity);
    alertDialogBuilder.setView(promptsView);

    // create alert dialog
    alertDialog = alertDialogBuilder.create();

    /**
     * setting up window design
     */
    alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);


    alertDialog.show();

    DisplayMetrics metrics = new DisplayMetrics(); //get metrics of screen
    mActivity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
    int height = (int) (metrics.heightPixels * 0.9); //set height to 90% of total
    int width = (int) (metrics.widthPixels * 0.9); //set width to 90% of total

    alertDialog.getWindow().setLayout(width, height); //set layout
    recyclerViewTime = promptsView.findViewById(R.id.recyclerViewTime);


    DialogSelectTimeAdapter dialogSelectTimeAdapter = new DialogSelectTimeAdapter(this);
    RecyclerView.LayoutManager linearLayoutManager = new LinearLayoutManager(this);
    recyclerViewTime.setLayoutManager(linearLayoutManager);
    recyclerViewTime.setAdapter(dialogSelectTimeAdapter);

    buttonDone = promptsView.findViewById(R.id.buttonDone);
    buttonDone.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            alertDialog.dismiss();

        }
    });

ไดอะล็อกที่กำหนดเองพร้อมด้วยความสูงที่กำหนดเองไดอะล็อก
Neelu Agrawal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.