Come posso ottenere una finestra di attività in stile Dialog per riempire lo schermo?


142

Sto usando un'attività con il set di temi della finestra di dialogo e voglio che sia a schermo intero. Ho provato ogni sorta di cose, anche attraverso il WindowManager per espandere manualmente la finestra a tutta larghezza e altezza, ma nulla funziona.

Apparentemente, una finestra di dialogo (o un'attività con il tema del dialogo) si espanderà solo in base al suo contenuto, ma anche questo non sempre funziona. Ad esempio, mostro un cerchio della barra di avanzamento con larghezza e altezza impostate su FILL_PARENT (così come il suo contenitore di layout), ma la finestra di dialogo si avvolge attorno alla barra di avanzamento molto più piccola invece di riempire lo schermo.

Deve esserci un modo per visualizzare qualcosa di piccolo all'interno di una finestra di dialogo ma deve espandersi a schermo intero senza ridimensionare il contenuto?


2
Nota interessante: quando si imposta la larghezza e l'altezza del contenitore di layout su un valore effettivo in pixel, la finestra di dialogo viene ridimensionata di conseguenza. Ma quando lo si imposta su FILL_PARENT, allora non ...
Matthias,

Veramente? Il layout dell'attività che sta istanziando, ha un tag relativo o LinearLayout principale impostato su altezza e larghezza di fill_parent? Ho implementato alcune attività con un tema di dialogo e non ho mai avuto problemi a occupare l'intero schermo.
MattC

Sì, l'attività ha un LinearLayout impostato su FILL_PARENT sia in larghezza che in altezza.
Matthias,

Ho risolto il problema utilizzando una soluzione alternativa, ma poiché questa non è una buona soluzione, lascerò aperta la domanda. Quello che ho fatto è stato di sottoclassare LinearLayout e sovrascrivere il suo metodo onMeasure (), che è responsabile per determinare la dimensione della vista durante un ciclo di layout e fissarlo alla larghezza e all'altezza dello schermo. Ciò non è corretto, dal momento che non tiene conto dello spazio occupato dalle barre dei menu, quindi il contenitore sarà effettivamente più alto di come appare sullo schermo (con tutti gli strani effetti collaterali come i bambini che scompaiono in aree non visibili di lo schermo).
Matthias,

Ho trovato la soluzione corretta, vedi la mia risposta di seguito.
Matthias,

Risposte:


312

Ho trovato la soluzione:

Nella tua attività che ha lo Theme.Dialogstile impostato, fai come segue:

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

    setContentView(R.layout.your_layout);

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

È importante chiamare Window.setLayout() dopo aver chiamato setContentView(), altrimenti non funzionerà.


5
Grazie, risparmiato il mio tempo, da nessuna parte avrei capito! ma hai idea del perché dobbiamo specificare esplicitamente nel codice, perché fill_parent non funziona tramite XML per attività con la finestra di dialogo del tema?
sabato

3
La mia finestra di dialogo non riempirà la larghezza, non tramite XML e non con questo metodo. Mi sto mangiando le unghie.
eitama,

6
Ed è:import android.view.ViewGroup.LayoutParams;

11
FILL_PARENT è ora obsoleto, utilizza invece
MATCH_PARENT

4
Non riempie l'intero schermo, è come se avesse una piccola imbottitura su ogni lato.
Machado,

66

Puoi aggiungere questi valori al tuo stile android: windowMinWidthMajor e 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
la soluzione più semplice. Funziona anche con la libreria di supporto di appcompat. Grazie.
Muhammad Saqib,

Questa dovrebbe essere una risposta accettata. Il modo più corretto e pulito per farlo. Prendi in considerazione l'utilizzo di parent = "@ style / Theme.AppCompat.Light.Dialog"
Kirill Karmazin,

Sembra che dovrebbe funzionare, ma non per me. Hmm, mi chiedo perché. Forse le cose sono cambiate dal 2014.
Scott Biggs,

53

Voglio solo riempire solo l'80% dello schermo per quello che mi è piaciuto di seguito

        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

funziona solo quando inserisco la riga getwindow (). setLayout ... sotto la setContentView (..)

grazie @Matthias


11

Avvolgi il tuo dialog_custom_layout.xml in RelativeLayout invece di qualsiasi altro layout. Ha funzionato per me.


1
Lo stesso qui, Larghezza e Altezza erano completamente sbagliate e non riuscivano a capire come risolvere. La conversione del layout di root in un RelativeLayout ha risolto anche i miei problemi!
SharpMobileCode

8

Per la finestra di dialogo Questo può essere utile per qualcuno. Voglio che una finestra di dialogo occupi tutta la larghezza dello schermo. cercato molto ma niente trovato utile. Finalmente questo ha funzionato per me:

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

dopo aver aggiunto questo, la mia finestra di dialogo appare a tutta larghezza dello schermo.


5

Questa risposta è una soluzione alternativa per coloro che usano "Theme.AppCompat.Dialog" o qualsiasi altro discendente "Theme.AppCompat.Dialog" come "Theme.AppCompat.Light.Dialog", "Theme.AppCompat.DayNight.Dialog", ecc. Io stesso devo usare la finestra di dialogo AppCompat perché utilizzo AppCompatActivity come estensione per tutte le mie attività. Ci sarà un problema che rende la finestra di dialogo con riempimento su tutti i lati (in alto, a destra, in basso e a sinistra) se utilizziamo la risposta accettata.

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

    setContentView(R.layout.your_layout);

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

Nello stile della tua attività, aggiungi questo codice

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

Come puoi notare, il problema che genera il riempimento nella nostra finestra di dialogo è "android: windowBackground", quindi qui rendo nullo lo sfondo della finestra.


2

Imposta una larghezza minima nella parte superiore del layout.

android:minWidth="300dp"

Per esempio:

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

La risposta di Matthias è per lo più corretta, ma non riempie ancora l'intero schermo in quanto ha una piccola imbottitura su ciascun lato (sottolineato da @Holmes). Oltre al suo codice, potremmo risolvere questo problema estendendo lo stile Theme.Dialog e aggiungendo alcuni attributi come questo.

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

Quindi dichiariamo semplicemente Attività con tema impostato su MyDialog:

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

1

Questo sarebbe utile per qualcuno come me. Crea uno stile di dialogo personalizzato:

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

Nel AndroidManifest.xmlset di file per l'attività desiderata:

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

Questo è tutto, non c'è bisogno di chiamare metodi programmaticamente.


mostra ancora il riempimento su ogni lato (in alto, a destra, in basso e a sinistra) e se dobbiamo mostrare anche la barra di stato, questa soluzione fallirà
HendraWD

Controlla stackoverflow.com/a/39590004/3940133 se hai un'imbottitura su ciascun lato
HendraWD

0

Nel tuo file manifest in cui è definita la nostra attività

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

senza barra delle azioni

<activity android:name=".YourPopUpActivity"
            android:theme="@android:style/Theme.Holo.Dialog.NoActionBar"/>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.