Як я можу отримати вікно діяльності у діалоговому вікні для заповнення екрана?


142

Я використовую активність із набором діалогових тем, і я хочу, щоб він був на весь екран. Я пробував усілякі речі, навіть пройшовши через WindowManager, щоб розширити вікно на повну ширину та висоту вручну, але нічого не працює.

Мабуть, діалогове вікно (або активність із темою діалогу) буде розширюватися лише відповідно до його вмісту, але навіть це не завжди працює. Наприклад, я показую коло смуги прогресу, у якого ширина та висота встановлені на FILL_PARENT (так само є його контейнером для компонування), але все-таки діалогове вікно обертається навколо набагато меншої панелі прогресу замість заповнення екрана.

Має бути спосіб відображення чогось маленького всередині діалогового вікна, але чи можна його розширити до повноекранного розміру, не змінюючи розмір вмісту?


2
Цікава примітка: Якщо встановити ширину та висоту контейнера макета на фактичне значення в пікселях, діалогове вікно відповідно змінюється. Але якщо встановити його на FILL_PARENT, тоді це не стане ...
Маттіас

Дійсно? Макет активність є миттєвим, чи має батьківський тег Relative або LinearLayout, встановлений на висоту та ширину fill_parent? Я реалізував кілька заходів із темою діалогу, і ніколи не мав проблем із цим, займаючи весь екран.
MattC

Так, для активності LinearLayout встановлено значення FILL_PARENT як для ширини, так і для висоти.
Маттіас

Я начебто вирішив проблему, використовуючи спосіб вирішення, але оскільки це не гарне рішення, я залишаю питання відкритим. Що я зробив, це підклас LinearLayout та переосмислення його методу onMeasure (), який відповідає за визначення розміру подання під час циклу компонування та виправити його на ширину та висоту екрана. Це невірно, оскільки це не враховує простір, який займають панелі меню, тому контейнер насправді буде вище, ніж це виглядає на екрані (при цьому всі дивні побічні ефекти, як діти, зникають у невидимих ​​областях екран).
Маттіас

Я знайшов правильне рішення, див. Мою відповідь нижче.
Маттіас

Відповіді:


312

Я знайшов рішення:

У своїй діяльності, в якій встановлено Theme.Dialogстиль, зробіть це:

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

    setContentView(R.layout.your_layout);

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

Важливо, щоб ви дзвонили Window.setLayout() після дзвінка setContentView(), інакше це не спрацює.


5
Дякую, врятував мій час, ніде я б цього не з'ясував! але будь-яка ідея, чому нам потрібно чітко вказати в коді, чому fill_parent не працює через xml для дій із діалогом теми?
сб

3
Моє діалогове вікно не заповнить ширину, не за XML і не за цим методом. Я їжу нігті.
eitama

6
І це:import android.view.ViewGroup.LayoutParams;

11
FILL_PARENT зараз застарілий, замість цього використовуйте MATCH_PARENT
AlexV

4
Це не заповнює весь екран, це як би у нього невелика підкладка з кожної сторони.
Мачадо

66

Ви можете додати ці значення до свого стилю android: windowMinWidthMajor та 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
Найпростіше рішення. Він також працює з бібліотекою підтримки appcompat. Дякую.
Мухаммед Сакіб

На це слід прийняти відповідь. Найбільш правильний і чистий спосіб це зробити. Подумайте про використання батьків = "@ style / Theme.AppCompat.Light.Dialog"
Кирило Кармазін

Здається, це має працювати, але це не для мене. Хм, мені цікаво чому. Можливо, все змінилося з 2014 року
Скотт Біггс,

53

Я просто хочу заповнити лише 80% екрану для того, що я зробив так, як показано нижче

        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

працює лише тоді, коли я ставлю рядок getwindow (). setLayout ... нижче setContentView (..)

дякую @Matthias


11

Загорніть свій діалог_custom_layout.xml в RelativeLayout замість будь-якого іншого макета. Це працювало для мене.


1
Тут же ширина і висота були абсолютно помилковими і не могли зрозуміти, як їх виправити. Перетворення кореневого макета в RelativeLayout виправило і мої проблеми!
SharpMobileCode

8

Для діалогу Це може допомогти комусь. Я хочу, щоб діалогове вікно зайняло повну ширину екрана. багато шукали, але нічого корисного не знайшли. Нарешті це спрацювало для мене:

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

після додавання цього моє діалогове вікно з'явиться на повній ширині екрана.


5

Ця відповідь є вирішенням для тих, хто використовує "Theme.AppCompat.Dialog" або будь-який інший "Theme.AppCompat.Dialog" нащадків типу "Theme.AppCompat.Light.Dialog", "Theme.AppCompat.DayNight.Dialog" тощо. Я сам повинен використовувати діалогове вікно AppCompat, оскільки я використовую AppCompatActivity як розширення для всіх моїх дій. Буде проблема, яка зробить діалогове вікно прокладкою з усіх боків (вгорі, вправо, внизу та зліва), якщо ми будемо використовувати прийняту відповідь.

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

    setContentView(R.layout.your_layout);

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

Додайте цей код у стилі своєї діяльності

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

Як ви можете помітити, проблема, яка генерує прокладку в нашому діалоговому вікні, - це "android: windowBackground", тому тут я роблю фон вікна нульовим.


2

Встановіть мінімальну ширину в самому верхньому макеті.

android:minWidth="300dp"

Наприклад:

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

Відповідь Маттіаса здебільшого правильна, але вона все ще не заповнює весь екран, оскільки у нього є невеликі накладки з кожного боку (на що вказує @Holmes). На додаток до його коду, ми могли б це виправити, розширивши стиль Theme.Dialog та додавши такі атрибути, як цей.

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

Тоді ми просто оголосимо Активність із темою, встановленою на MyDialog:

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

1

Це було б корисно для когось, як я. Створіть спеціальний стиль діалогу:

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

У AndroidManifest.xmlфайлі заданій темі для хотів діяльності:

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

Тобто все, не потрібно називати методи програмно.


як і раніше показувати прокладки з усіх боків (зверху, праворуч, знизу та зліва), і якщо нам теж потрібно буде показати статус стану, це рішення не вдасться
HendraWD

Перевірте stackoverflow.com/a/39590004/3940133, чи є у вас підкладки з усіх боків
HendraWD

0

У вашому файлі маніфесту, де визначена наша діяльність

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

без панелі дій

<activity android:name=".YourPopUpActivity"
            android:theme="@android:style/Theme.Holo.Dialog.NoActionBar"/>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.