Bagaimana cara membuat dialog peringatan mengisi 90% ukuran layar?

305

Saya dapat membuat dan menampilkan dialog lansiran khusus dengan baik tetapi meskipun demikian yang saya miliki android:layout_width/height="fill_parent"dalam dialog xml hanya sebesar isinya.

Yang saya inginkan adalah dialog yang mengisi seluruh layar kecuali mungkin lapisan 20 piksel. Maka gambar yang merupakan bagian dari dialog akan secara otomatis merentang ke ukuran dialog penuh dengan fill_parent.

Fabian
sumber

Jawaban:

355

Menurut pengembang platform Android Dianne Hackborn dalam posting grup diskusi ini , Dialog menetapkan lebar dan tinggi tata letak tingkat atas Window mereka WRAP_CONTENT. Untuk membuat Dialog lebih besar, Anda dapat mengatur parameter tersebut MATCH_PARENT.

Kode demo:

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

Perhatikan bahwa atribut ditetapkan setelah Dialog ditampilkan. Sistem ini rewel tentang kapan mereka diatur. (Saya kira mesin tata letak harus mengaturnya saat dialog pertama kali ditampilkan, atau sesuatu.)

Akan lebih baik untuk melakukan ini dengan memperluas Theme.Dialog, maka Anda tidak perlu memainkan permainan menebak tentang kapan harus memanggil setAttributes. (Meskipun sedikit lebih sulit untuk membuat dialog secara otomatis mengadopsi tema terang atau gelap yang sesuai, atau tema Honeycomb Holo. Itu dapat dilakukan sesuai dengan http://developer.android.com/guide/topics/ui/themes. html # SelectATheme )

nm
sumber
5
Apakah saya tidak mengerti jawabannya, atau tidak berhasil untuk saya.
David Morales
4
Tampaknya tidak benar bahwa dialog lebar wrap_content. Segala sesuatunya dibuat lebih sempit dan terputus. Dialog tampaknya diatur ke beberapa lebar maksimum yang telah ditentukan.
Peter Ajtai
21
Saya tidak mengerti bagaimana ini menjawab pertanyaan? Apakah kode yang disarankan oleh @nmr membuat Dialog menjadi 90% dari layar? Karena aku tidak melihatnya. Dialog hanya diatur ke fill_width, jadi itu 100%, bukan 90%, kan?
Ted
4
@Ted, tema yang digunakan oleh AlertDialog memiliki margin. Jadi hasilnya tidak sampai ke tepi layar, ia mengisi sekitar 90% dari itu. (Jelas bukan 90%, hanya perkiraan estetika 90%)
nmr
8
Hanya menelepon d.getWindow (). GetAttributes (). Width = WindowManager.LayoutParams.FILL_PARENT; sebelum memanggil show () akan melakukan trik. Juga, saya punya beberapa masalah dengan metode yang diberikan karena latar belakang dialog menjadi tidak transparan. Segera setelah dihapus copyFrom (() masalah diperbaiki sendiri
Alexey
183

Coba bungkus tata letak dialog khusus Anda RelativeLayoutsebagai ganti LinearLayout. Itu berhasil bagi saya.

cvarsendan
sumber
2
itu untuk saya juga. Adakah yang bisa menjelaskan alasannya !!
Rozina
Apakah ini cara RelativeLayout seharusnya bekerja atau kecelakaan bahagia yang bisa hilang?
Yetti99
10
Ini 2019 dan ini masih berfungsi. Bersulang! Seharusnya memang jawaban yang diterima.
TaylanUB
@cvarsendan dapatkah Anda menjelaskan jawabannya? Itu berhasil bagi saya. Terima kasih!
Jaco
OMG, My RecyclerView tidak pernah menampilkan ketinggian penuh atau tingginya selalu 0 dan kemudian dengan ini berfungsi sempurna setelah sehari mencoba banyak solusi. Mengapa RelativeLayout selain yang lain?
leegor
85

Menentukan FILL_PARENT di jendela dialog, seperti yang disarankan orang lain, tidak berfungsi untuk saya (di Android 4.0.4), karena hanya merentangkan latar belakang dialog hitam untuk mengisi seluruh layar.

Yang berfungsi dengan baik adalah menggunakan nilai tampilan minimum, tetapi menspesifikasikannya dalam kode, sehingga dialog mengambil 90% layar.

Begitu:

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

Secara umum hanya menyesuaikan lebar harus cukup dalam banyak kasus.

koma
sumber
Ini tampaknya tidak berfungsi sepenuhnya pada 4.0 dan di atas. Itu tidak mengisi 90% layar. Ada yang tahu kenapa? Saya melakukan ini di Motorola Xoom dengan 4.0
Ryan Gray
@RyanGray Ini berfungsi untuk saya pada Samsung Nexus S dengan OS yang diperbarui. Tanpa informasi tambahan saya sayangnya tidak dapat membantu Anda.
koma
83

Atur android:minWidthdan android:minHeightdalam tampilan kustom Anda xml. Ini dapat memaksa peringatan untuk tidak hanya membungkus ukuran konten. Menggunakan tampilan seperti ini harus melakukannya:

<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>
jqpubliq
sumber
3
Ya dengan ini saya dapat mengaturnya ke ukuran tertentu, tetapi saya ingin itu menjadi screensize dikurangi padding misalnya 20 pixel. Atau lebar = 90% dari lebar layar.
Fabian
4
Kerapatan piksel independen selalu diskalakan sehingga setiap layar 320x480dp sehingga tampilan 300x460dp akan menjadi bantalan 20dp dalam semua kasus. Atau Anda dapat menemukan ukuran layar seperti ini: Tampilan layar = ((WindowManager) getSystemService (Konteks.WINDOW_SERVICE)). GetDefaultDisplay (); int width = display.getWidth (); dan atur maxWidth dan maxHeight sesuai.
jqpubliq
5
Hmm dari dekoumentasinya saya mengerti konsep dp. Tetapi bagaimana jika rasio layar 16: 9 atau 4: 3? Akankah dp ditarik tidak rata?
Fabian
2
Tidak, resolusi dp hanya 320x480 jika rasio layarnya 2: 3, jadi metode ini tidak akan berfungsi.
mhsmith
21
apa, mengapa jawaban ini dijatuhkan berkali-kali? ini adalah solusi yang mengerikan karena sama sekali tidak memperhatikan ukuran perangkat yang digunakan pengguna.
Jin
71

Lebih sederhana lagi lakukan ini:

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

alertDialog.getWindow().setLayout(width, height);
FOMDeveloper
sumber
catatan kecil: getResources () tersedia dalam konteks Aktivitas.
nat101
Jawaban ini sangat membantu untuk skenario mencoba membuat ulang dialog onCreatesetelah rotasi perangkat. Dalam hal ini, kami tidak dapat mengandalkan lebar / tinggi dari apa pun di tata letak, karena belum dibuat; tetapi lebar fisik / tinggi perangkat masih tersedia.
Tim Biegeleisen
5
Jika Anda ingin mengubah hanya satu dimensi, berikan ViewGroup.LayoutParams.WRAP_CONTENTsebagai salah satu parameter
Vadim Kotov
Ini solusi terbaik untukku.
Teekam Suthar
53
dialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
Elvis
sumber
1
Ini bekerja untuk saya dan mudah diterjemahkan ke MonoDroid yang berfungsi seperti itu (di mana d adalah Dialog baru): d.Window.SetLayout (WindowManagerLayoutParams.FillParent, WindowManagerLayoutParams.FillParent);
theJerm
10
Tetapi 90% tidak sama dengan 100%. FILL_PARENT akan mengindikasikan untuk mengisi seluruh lebar, 100%, bukan 90%. Baik?
Ted
@Ted Anda benar. Anda dapat mengganti FILL_PARENTdengan lebar yang dihitung sebagai 90% dari lebar tampilan saat ini. Tapi saya suka jawabannya karena lebih mudah daripada yang lain.
HRJ
27

Semua jawaban lain di sini masuk akal, tetapi tidak memenuhi apa yang dibutuhkan Fabian. Ini solusi saya. Ini mungkin bukan solusi yang sempurna tetapi itu bekerja untuk saya. Ini menunjukkan dialog yang pada layar penuh tetapi Anda dapat menentukan padding di atas, bawah, kiri atau kanan.

Pertama-tama letakkan ini di res / values ​​/ styles.xml Anda:

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

Seperti yang Anda lihat saya punya android: paddingTop = 20dp pada dasarnya yang Anda butuhkan. The android: windowBackground = @ warna / Black0Percent hanya kode warna dideklarasikan pada color.xml saya

res / values ​​/ color.xml

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

Kode Warna itu hanya berfungsi sebagai boneka untuk menggantikan latar belakang jendela default Dialog dengan warna transparansi 0%.

Selanjutnya buat res / layout / dialog.xml tata letak dialog khusus

<?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>

Terakhir, inilah dialog kami yang menetapkan tampilan khusus yang menggunakan dialog.xml kami:

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

Kesimpulan: Saya mencoba mengganti tema dialog di styles.xml bernama CustomDialog. Itu mengesampingkan tata letak jendela Dialog dan memberi saya kesempatan untuk mengatur padding dan mengubah opacity dari latar belakang. Ini mungkin bukan solusi yang sempurna tapi saya harap ini membantu Anda .. :)

icaneatclouds
sumber
itu berfungsi untuk jellybean untuk saat ini saya belum bisa mengujinya bulid lain
Nasz Njoka Sr.
Tampaknya solusi terbersih dan paling elegan. Bekerja pada Kitkat 4.4 dan 4.3.
David
Saya memiliki dialog khusus, dan TIDAK ADA yang berfungsi sampai saya melihat ini, keajaiban, ALL THE MAGIC pada dialog kustom (yang meluas DialogFragment) muncul ketika Anda melakukannya: Dialog customDialog = new Dialog(context, STYLE);terima kasih, BENAR-BENAR, terima kasih.
Sierisimo
Senang tahu itu membantu :)
icaneatclouds
Ini berfungsi seperti pesona untuk jendela dialog! (Anda juga dapat menentukan Black60Percent untuk memiliki jendela asli diklik) Efek sampingnya adalah semua pandangan saya dalam dialog mewarisi paddings yang saya atur untuk dialog ....
runholen
25

Anda dapat menggunakan persentase untuk lebar dialog windows (HANYA).

Lihat contoh ini dari 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>

Yang perlu Anda lakukan adalah memperluas tema ini dan mengubah nilai untuk "Mayor" dan "Kecil" menjadi 90%, bukannya 65%.

Salam.

Joao Gavazzi
sumber
1
Untuk menggunakan ini dengan dialog, cukup lewati gaya khusus Anda di konstruktor pembangun dialog :)
sosite
23

Berikut ini berfungsi dengan baik untuk saya:

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

(catatan: windowMinWidthMajor / Minor seperti yang disarankan dalam jawaban sebelumnya tidak berhasil. Dialog saya terus berubah ukuran tergantung pada konten)

lalu:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.MyAlertDialogTheme);
Deliriom
sumber
4
Jawaban terbaik sejauh ini. Bekerja dengan sempurna untuk saya!
Pawan
Saya bertanya-tanya: bagaimana saya bisa mendapatkan nilai dimensi khusus seperti itu, yang ditetapkan dalam persentase, melalui kode?
pengembang android
19

Solusi dengan perhitungan 90% aktual:

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

di mana getScreenWidth(Activity activity)didefinisikan sebagai berikut (terbaik diletakkan di kelas Utils):

public static int getScreenWidth(Activity activity) {
   Point size = new Point();
   activity.getWindowManager().getDefaultDisplay().getSize(size);
   return size.x;
}
Mehmet K
sumber
berfungsi seperti pesona untuk appcompatactivity yang seharusnya berfungsi seperti dialog
Saya mendapatkan indeks array tidak terikat pada ini :(
Dr. aNdRO
@ Dr.aNdRO bagaimana? Baris yang mana? Apakah Anda yakin ini bagian dari kode dan bukan yang lain?
Mehmet K
.setLayout () Saya mendapatkan di baris ini, Ketika saya mengubahnya ke WRAP ISI ini berfungsi dengan baik
Dr. aNdRO
10

Dapatkan lebar perangkat:

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

kemudian gunakan itu untuk membuat dialog 90% perangkat,

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();
Gopinath
sumber
8

Nah, Anda harus mengatur tinggi dan lebar dialog Anda sebelum menunjukkan ini (dialog.show ())

jadi, lakukan sesuatu seperti ini:

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

//then

dialog.show()
shontauro
sumber
Tidak mengatur dimensi untuk saya. API> = 21.
Odys
7

Sejauh ini, cara paling sederhana yang bisa saya pikirkan -

Jika dialog Anda dibuat dari LinearLayout vertikal, cukup tambahkan tampilan boneka "tinggi mengisi", yang akan menempati seluruh ketinggian layar.

Sebagai contoh -

<?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>

Perhatikan android:weightSum="1"atribut dalam LinearLayout dan atribut android:layout_weight="1"dalam tampilan dummy

Ron Tesler
sumber
Bagus! Ini menjaga tampilan web saya dari mulai yang sangat singkat dan berkembang hingga ketinggian penuh setelah onPageFinished. Pujian!
Nancy
6

Nah, Anda harus mengatur tinggi dan lebar dialog Anda sebelum menunjukkan ini (dialog.show ())

jadi, lakukan sesuatu seperti ini:

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

//then

dialog.show()

Mendapatkan kode ini, saya membuatnya beberapa perubahan:

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

Namun, ukuran dialog dapat berubah ketika perangkat mengubah posisinya. Mungkin Anda perlu menangani sendiri saat metrik berubah. PD: peekDecorView, menyiratkan bahwa tata letak dalam aktivitas diinisialisasi dengan benar jika tidak, Anda dapat menggunakan

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

untuk mendapatkan ukuran layar

Juan Otero
sumber
6

Setelah menginisialisasi objek dialog Anda dan atur tampilan konten. Lakukan ini dan nikmati.

(dalam hal ini saya menetapkan 90% untuk lebar dan 70% untuk tinggi karena lebar 90% akan lebih dari toolbar)

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();
Guilherme Pereira
sumber
4

Jawaban saya didasarkan pada koma tetapi tidak perlu menimpa onStart tetapi hanya onCreateView yang hampir selalu ditimpa secara default ketika Anda membuat fragmen baru.

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

Saya sudah mengujinya di Android 5.0.1.

Kresimir Plese
sumber
3

Inilah varian saya untuk lebar dialog khusus:

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

Jadi tergantung pada orientasi perangkat (ThemeHelper.isPortrait(mContext) ) lebar dialog akan menjadi 95% (untuk mode potret) atau 65% (untuk lanskap). Ini sedikit lebih banyak dari yang penulis tanyakan tetapi bisa bermanfaat bagi seseorang.

Anda perlu membuat kelas yang meluas dari Dialog dan memasukkan kode ini ke Anda onCreate(Bundle savedInstanceState) metode .

Untuk tinggi dialog, kode harus sama dengan ini.

Klan
sumber
Apa ThemeHelper? Saya tidak memiliki kelas ini tersedia di proyek saya.
Nemi
ThemeHelperhanyalah kelas pembantu untuk kebutuhan saya. Metodenya isPortrait(Context)mengembalikan apakah orientasi layar perangkat adalah potret atau lanskap.
Klan
ini akan memiliki masalah jika sekali dialog dimuat dan kemudian kita mengubah orientasi, itu akan mempertahankan pengaturan awal di 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;
        }
    }
Krunal Shah
sumber
3

Di atas banyak jawaban yang baik tetapi tidak ada yang bekerja untuk saya sepenuhnya. Jadi saya menggabungkan jawaban dari @nmr dan mendapatkan yang ini.

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();
anand
sumber
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
Guihgo
sumber
3
menampilkan dialog sebelum tata letak pengaturan berfungsi untuk saya.
Angel Koh
2

Anda perlu menggunakan style @ style.xml seperti CustomDialog untuk menampilkan dialog yang dapat disesuaikan.

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

dan gunakan gaya ini di Activity.java seperti ini

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

dan custom_dialog.xml Anda harus ada di dalam direktori layout Anda

<?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>
Nuwan Withanage
sumber
2

Jika Anda menggunakan Constraint Layout , Anda dapat mengatur tampilan di dalamnya, untuk mengisi persentase layar dengan:

layout_constraintWidth_percent = "0.8"

Jadi, misalnya, jika Anda memiliki ScrollView di dalam dialog dan Anda ingin mengaturnya ke persentase tinggi layar. Akan seperti ini:

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

Semoga ini bisa membantu seseorang !!

Lucas
sumber
2

Berikan saja AlertDialog tema ini

<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>
karimaounn
sumber
1

Berikut adalah jawaban singkat yang berfungsi untuk saya (Diuji pada API 8 dan 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);
Tanasis
sumber
1
dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.WRAP_CONTENT);
Sai Gopi N
sumber
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
sumber
dialog kustom dengan tinggi kustom dialog
Neelu Agrawal