Bagaimana saya bisa mendapatkan jendela aktivitas gaya Dialog untuk mengisi layar?


142

Saya menggunakan aktivitas dengan set tema dialog, dan saya ingin itu menjadi layar penuh. Saya mencoba segala macam hal, bahkan melalui WindowManager untuk memperluas jendela menjadi lebar penuh dan tinggi secara manual, tetapi tidak ada yang berhasil.

Tampaknya, jendela dialog (atau aktivitas dengan tema dialog) hanya akan berkembang sesuai dengan isinya, tetapi itu pun tidak selalu berhasil. Misalnya, saya memperlihatkan lingkaran bilah progres yang memiliki lebar dan tinggi diatur ke FILL_PARENT (demikian juga wadah tata letaknya), tetapi tetap saja, dialog membungkus bilah progres yang jauh lebih kecil daripada mengisi layar.

Pasti ada cara untuk menampilkan sesuatu yang kecil di dalam jendela dialog tetapi apakah itu diperluas ke ukuran layar penuh tanpa mengubah ukuran kontennya juga?


2
Catatan menarik: Saat mengatur lebar dan tinggi penampung tata letak ke nilai aktual dalam piksel, maka dialog akan menyesuaikan ukurannya. Tetapi ketika mengaturnya ke FILL_PARENT, maka itu tidak ...
Matthias

Betulkah? Tata letak aktivitas adalah instantiating, apakah ia memiliki tag Relative atau LinearLayout induk yang disetel ke tinggi dan lebar fill_parent? Saya telah mengimplementasikan beberapa kegiatan dengan tema dialog dan tidak pernah memiliki masalah dengan itu mengambil seluruh layar.
MattC

Ya, aktivitas memiliki LinearLayout yang disetel ke FILL_PARENT untuk lebar dan tinggi.
Matthias

Saya semacam memecahkan masalah dengan menggunakan solusi, tetapi karena ini bukan solusi yang baik, saya akan membiarkan pertanyaan terbuka. Apa yang saya lakukan adalah subclass LinearLayout dan menimpa metode onMeasure (), yang bertanggung jawab untuk menentukan ukuran tampilan selama siklus tata letak, dan memperbaikinya ke lebar dan tinggi layar. Ini tidak benar, karena ini tidak memperhitungkan ruang yang ditempati oleh menu bar, sehingga wadah sebenarnya akan lebih tinggi daripada yang terlihat di layar (dengan semua efek samping yang aneh seperti anak-anak yang menghilang di area yang tidak terlihat. layar).
Matthias

Saya menemukan solusi yang tepat, lihat jawaban saya di bawah ini.
Matthias

Jawaban:


312

Saya menemukan solusinya:

Dalam aktivitas Anda yang memiliki Theme.Dialogset gaya, lakukan ini:

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

    setContentView(R.layout.your_layout);

    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

Penting bagi Anda untuk menelepon Window.setLayout() setelah menelepon setContentView(), jika tidak maka tidak akan berhasil.


5
Terima kasih, menghemat waktu saya, tidak ada tempat saya akan tahu ini! tetapi ada ide mengapa kita harus secara eksplisit menentukan dalam kode, mengapa fill_parent tidak bekerja melalui xml untuk kegiatan dengan dialog tema?
sat

3
Dialog saya tidak akan mengisi lebar, bukan dengan XML, dan bukan dengan metode ini. Saya memakan kuku saya.
eitama

6
Dan itu adalah:import android.view.ViewGroup.LayoutParams;

11
FILL_PARENT sudah ditinggalkan sekarang, gunakan MATCH_PARENT sebagai gantinya
AlexV

4
Itu tidak mengisi seluruh layar, itu seperti memiliki bantalan kecil di setiap sisi.
Machado

66

Anda dapat menambahkan nilai ini ke gaya android Anda: windowMinWidthMajor dan android: windowMinWidthMinor

<style name="Theme_Dialog" parent="android:Theme.Holo.Dialog">
    ...
    <item name="android:windowMinWidthMajor">97%</item>
    <item name="android:windowMinWidthMinor">97%</item>
</style>

2
solusi paling mudah. Ini juga bekerja dengan perpustakaan dukungan appcompat. Terima kasih.
Muhammad Saqib

Ini harus diterima jawaban. Cara paling tepat dan bersih untuk melakukannya. Pertimbangkan untuk menggunakan parent = "@ style / Theme.AppCompat.Light.Dialog"
Kirill Karmazin

Sepertinya ini seharusnya berhasil, tetapi tidak untuk saya. Hmm, saya bertanya-tanya mengapa. Mungkin banyak hal telah berubah sejak 2014.
Scott Biggs

53

Saya hanya ingin mengisi hanya 80% dari layar untuk itu saya suka ini di bawah ini

        DisplayMetrics metrics = getResources().getDisplayMetrics();
        int screenWidth = (int) (metrics.widthPixels * 0.80);

        setContentView(R.layout.mylayout);

        getWindow().setLayout(screenWidth, LayoutParams.WRAP_CONTENT); //set below the setContentview

ini hanya berfungsi ketika saya meletakkan getwindow (). setLayout ... baris di bawah setContentView (..)

terima kasih @Matthias


11

Bungkus dialog_custom_layout.xml Anda menjadi RelativeLayout alih-alih tata letak lainnya. Itu berhasil bagi saya.


1
Sama di sini, Lebar dan Tinggi benar-benar salah dan tidak tahu cara memperbaikinya. Mengubah tata letak root ke RelativeLayout juga memperbaiki masalah saya!
SharpMobileCode

8

Untuk Dialog Ini mungkin bermanfaat bagi seseorang. Saya ingin dialog mengambil lebar layar penuh. mencari banyak tetapi tidak ada yang berguna. Akhirnya ini berhasil bagi saya:

mDialog.setContentView(R.layout.my_custom_dialog);
mDialog.getWindow().setBackgroundDrawable(null);

setelah menambahkan ini, dialog saya muncul di layar lebar penuh.


5

Jawaban ini adalah solusi bagi mereka yang menggunakan "Theme.AppCompat.Dialog" atau "Theme.AppCompat.Dialog" lainnya seperti "Theme.AppCompat.Light.Dialog", "Theme.AppCompat.DayNight.Dialog", dll. Saya sendiri harus menggunakan dialog AppCompat karena saya menggunakan AppCompatActivity sebagai ekstensi untuk semua aktivitas saya. Akan ada masalah yang membuat dialog memiliki padding di setiap sisi (atas, kanan, bawah dan kiri) jika kita menggunakan jawaban yang diterima.

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

    setContentView(R.layout.your_layout);

    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

Pada gaya Aktivitas Anda, tambahkan kode ini

<style name="DialogActivityTheme" parent="Theme.AppCompat.Dialog">
    <item name="windowNoTitle">true</item>
    <item name="android:windowBackground">@null</item>
</style>

Seperti yang Anda perhatikan, masalah yang menghasilkan padding ke dialog kami adalah "android: windowBackground", jadi di sini saya membuat latar belakang jendela menjadi nol.


2

Tetapkan lebar minimum di tata letak paling atas.

android:minWidth="300dp"

Sebagai contoh:

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

<!-- Put remaining contents here -->

</LinearLayout>

2

Jawaban Matthias sebagian besar benar tetapi masih belum mengisi seluruh layar karena memiliki padding kecil di setiap sisi (ditunjukkan oleh @ Holmes). Selain kodenya, kita dapat memperbaikinya dengan memperluas gaya Theme.Dialog dan menambahkan beberapa atribut seperti ini.

<style name="MyDialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowNoTitle">true</item>
</style>

Kemudian kita cukup mendeklarasikan Activity dengan theme set ke MyDialog:

<activity
    android:name=".FooActivity"
    android:theme="@style/MyDialog" />

1

Ini akan sangat membantu untuk orang seperti saya. Buat gaya dialog khusus:

<style name="MyDialog" parent="Theme.AppCompat.Light.Dialog">
    <item name="windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowIsFloating">false</item>
</style>

Dalam AndroidManifest.xmlset file tema untuk aktivitas yang diinginkan:

<activity
        android:name=".CustomDialog"
        ...
        android:theme="@style/MyDialog"/>

Itu semua, tidak perlu memanggil metode programatik.


masih menunjukkan padding di setiap sisi (atas, kanan, bawah dan kiri) dan jika kita perlu menunjukkan status bar juga, solusi ini akan gagal
HendraWD

Periksa stackoverflow.com/a/39590004/3940133 jika Anda memiliki bantalan di setiap sisi
HendraWD

0

Di file manifes Anda tempat aktivitas kami didefinisikan

<activity
        android:name=".YourPopUpActivity"
        android:theme="@android:style/Theme.Holo.Dialog" >
    </activity>

tanpa bilah tindakan

<activity android:name=".YourPopUpActivity"
            android:theme="@android:style/Theme.Holo.Dialog.NoActionBar"/>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.