Wie kann ich ein Aktivitätsfenster im Dialogstil erhalten, um den Bildschirm auszufüllen?

142

Ich verwende eine Aktivität mit dem Dialog-Themensatz und möchte, dass sie im Vollbildmodus angezeigt wird. Ich habe alle möglichen Dinge ausprobiert und sogar den WindowManager durchlaufen, um das Fenster manuell auf volle Breite und Höhe zu erweitern, aber nichts funktioniert.

Anscheinend wird ein Dialogfenster (oder eine Aktivität mit dem Dialogthema) nur entsprechend seinem Inhalt erweitert, aber selbst das funktioniert nicht immer. Zum Beispiel zeige ich einen Fortschrittsbalkenkreis, dessen Breite und Höhe auf FILL_PARENT gesetzt ist (ebenso wie sein Layout-Container), aber der Dialog umschließt dennoch den viel kleineren Fortschrittsbalken, anstatt den Bildschirm auszufüllen.

Es muss eine Möglichkeit geben, etwas Kleines in einem Dialogfenster anzuzeigen, aber muss es auf Vollbildgröße erweitert werden, ohne dass auch die Größe des Inhalts geändert wird?

Matthias
quelle
2
Interessanter Hinweis: Wenn Sie die Breite und Höhe des Layout-Containers auf einen tatsächlichen Wert in Pixel einstellen, wird die Größe des Dialogfelds entsprechend geändert. Aber wenn es auf FILL_PARENT gesetzt wird, dann nicht ...
Matthias
"Ja wirklich?" Hat das Layout, das die Aktivität instanziiert, ein übergeordnetes Relative- oder LinearLayout-Tag, das auf Höhe und Breite von fill_parent festgelegt ist? Ich habe einige Aktivitäten mit einem Dialogthema implementiert und hatte nie ein Problem damit, den gesamten Bildschirm einzunehmen.
MattC
Ja, für die Aktivität ist das LinearLayout für Breite und Höhe auf FILL_PARENT festgelegt.
Matthias
Ich habe das Problem mithilfe einer Problemumgehung gelöst, aber da dies keine gute Lösung ist, lasse ich die Frage offen. Was ich getan habe, war, LinearLayout zu unterklassifizieren und seine onMeasure () -Methode zu überschreiben, die für die Bestimmung der Größe der Ansicht während eines Layoutzyklus verantwortlich ist, und sie auf die Bildschirmbreite und -höhe festzulegen. Dies ist jedoch nicht korrekt, da dies nicht den Platz berücksichtigt, den die Menüleisten einnehmen, sodass der Container tatsächlich größer ist, als es auf dem Bildschirm aussieht (mit all den seltsamen Nebenwirkungen wie Kindern, die in nicht sichtbaren Bereichen von verschwinden der Bildschirm).
Matthias
Ich habe die richtige Lösung gefunden, siehe meine Antwort unten.
Matthias

Antworten:

312

Ich habe die Lösung gefunden:

Gehen Sie in Ihrer Aktivität, für die der Theme.DialogStil festgelegt wurde, folgendermaßen vor:

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

    setContentView(R.layout.your_layout);

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

Es ist wichtig, dass Sie Window.setLayout() nach dem Anruf anrufen setContentView(), sonst funktioniert es nicht.

Matthias
quelle
5
Danke, hat mir Zeit gespart, nirgendwo hätte ich das herausgefunden! Aber eine Idee, warum wir explizit im Code angeben müssen, warum fill_parent für Aktivitäten mit Themendialog nicht über XML funktioniert?
saß
3
Mein Dialogfeld füllt die Breite nicht, nicht nach XML und nicht nach dieser Methode. Ich esse meine Nägel.
Eitama
6
Und es ist:import android.view.ViewGroup.LayoutParams;
11
FILL_PARENT ist jetzt veraltet, verwenden Sie stattdessen
MATCH_PARENT
4
Es füllt nicht den gesamten Bildschirm aus, es ist, als hätte es auf jeder Seite eine kleine Polsterung.
Machado
66

Sie können diese Werte zu Ihrem Android-Stil hinzufügen: windowMinWidthMajor und android: windowMinWidthMinor

<style name="Theme_Dialog" parent="android:Theme.Holo.Dialog">
    ...
    <item name="android:windowMinWidthMajor">97%</item>
    <item name="android:windowMinWidthMinor">97%</item>
</style>
Serhii Nadolynskyi
quelle
2
einfachste Lösung. Es funktioniert auch mit der Appcompat-Unterstützungsbibliothek. Vielen Dank.
Muhammad Saqib
Dies sollte als Antwort akzeptiert werden. Der richtige und sauberste Weg, dies zu tun. Erwägen Sie die Verwendung von parent = "@ style / Theme.AppCompat.Light.Dialog"
Kirill Karmazin
Das scheint zu funktionieren, aber für mich nicht. Hmm, ich frage mich warum. Vielleicht haben sich die Dinge seit 2014 geändert.
Scott Biggs
53

Ich möchte nur 80% des Bildschirms ausfüllen, weil mir das unten gefallen hat

        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

Es funktioniert nur, wenn ich die Zeile getwindow (). setLayout ... unter setContentView (..) setze.

danke @Matthias

Padma Kumar
quelle
11

Wickeln Sie Ihre dialog_custom_layout.xml in RelativeLayout anstatt in ein anderes Layout ein. Das hat bei mir funktioniert.

Ayan
quelle
1
Auch hier waren Breite und Höhe völlig falsch und konnten nicht herausfinden, wie sie repariert werden sollten. Das Konvertieren des Root-Layouts in ein RelativeLayout hat auch meine Probleme behoben!
SharpMobileCode
8

Für den Dialog Dies kann für jemanden hilfreich sein. Ich möchte, dass ein Dialog die gesamte Bildschirmbreite einnimmt. viel gesucht, aber nichts nützlich gefunden. Endlich hat das bei mir geklappt:

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

Nach dem Hinzufügen wird mein Dialogfeld in voller Bildschirmbreite angezeigt.

Rahul Sharma
quelle
5

Diese Antwort ist eine Problemumgehung für diejenigen, die "Theme.AppCompat.Dialog" oder andere Nachkommen von "Theme.AppCompat.Dialog" wie "Theme.AppCompat.Light.Dialog", "Theme.AppCompat.DayNight.Dialog" usw. verwenden. Ich selbst muss den AppCompat-Dialog verwenden, da ich AppCompatActivity als Erweiterung für alle meine Aktivitäten verwende. Es wird ein Problem geben, bei dem der Dialog auf allen Seiten (oben, rechts, unten und links) aufgefüllt ist, wenn wir die akzeptierte Antwort verwenden.

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

    setContentView(R.layout.your_layout);

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

Fügen Sie diesen Code im Stil Ihrer Aktivität hinzu

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

Wie Sie vielleicht bemerken, ist das Problem, das das Auffüllen unseres Dialogfelds erzeugt, "android: windowBackground", also mache ich hier den Fensterhintergrund auf null.

HendraWD
quelle
2

Stellen Sie eine Mindestbreite am obersten Layout ein.

android:minWidth="300dp"

Beispielsweise:

<?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>
Roy Mathew
quelle
2

Matthias 'Antwort ist größtenteils richtig, aber sie füllt immer noch nicht den gesamten Bildschirm aus, da sie auf jeder Seite eine kleine Polsterung aufweist (hervorgehoben von @Holmes). Zusätzlich zu seinem Code können wir dies beheben, indem wir den Theme.Dialog-Stil erweitern und einige Attribute wie dieses hinzufügen.

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

Dann deklarieren wir einfach Aktivität mit dem Thema MyDialog:

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

Dies wäre hilfreich für jemanden wie mich. Erstellen Sie einen benutzerdefinierten Dialogstil:

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

Im AndroidManifest.xmlDateisatzthema für die gewünschte Aktivität:

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

Das ist alles, keine Notwendigkeit, Methoden programmatisch aufzurufen.

Stanojkovic
quelle
zeigen immer noch Polsterung auf jeder Seite (oben, rechts, unten und links) und wenn wir auch die Statusleiste
anzeigen müssen
Überprüfen Sie stackoverflow.com/a/39590004/3940133, ob Sie Polsterung auf jeder Seite haben
HendraWD
0

In Ihrer Manifestdatei, in der unsere Aktivität definiert ist

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

ohne Aktionsleiste

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