Jak sprawić, by okno aktywności w stylu okna dialogowego wypełniało ekran?

142

Używam działania z ustawionym motywem okna dialogowego i chcę, aby było ono wyświetlane na pełnym ekranie. Próbowałem różnych rzeczy, nawet przechodząc przez WindowManager, aby ręcznie rozszerzyć okno do pełnej szerokości i wysokości, ale nic nie działa.

Wygląda na to, że okno dialogowe (lub działanie z motywem okna dialogowego) rozszerza się tylko zgodnie z zawartością, ale nawet to nie zawsze działa. Na przykład pokazuję koło paska postępu, które ma szerokość i wysokość ustawioną na FILL_PARENT (tak samo jak jego kontener układu), ale mimo to okno dialogowe zawija się wokół znacznie mniejszego paska postępu zamiast wypełniać ekran.

Musi istnieć sposób na wyświetlenie czegoś małego w oknie dialogowym, ale czy może ono rozwinąć się do pełnego ekranu bez zmiany rozmiaru jego zawartości?

Matthias
źródło
2
Interesująca uwaga: Podczas ustawiania szerokości i wysokości kontenera układu na rzeczywistą wartość w pikselach, okno dialogowe odpowiednio się zmienia. Ale kiedy ustawisz go na FILL_PARENT, to nie ...
Matthias
Naprawdę? Układ, którego instancję tworzy działanie, czy ma tag nadrzędny Relative lub LinearLayout, dla którego ustawiono wysokość i szerokość elementu fill_parent? Zaimplementowałem kilka działań z motywem okna dialogowego i nigdy nie miałem problemu z zajmowaniem całego ekranu.
MattC
Tak, działanie ma LinearLayout ustawioną na FILL_PARENT zarówno dla szerokości, jak i wysokości.
Matthias
W pewnym sensie rozwiązałem problem, stosując obejście, ale ponieważ nie jest to dobre rozwiązanie, pozostawię pytanie otwarte. To, co zrobiłem, to podklasa LinearLayout i nadpisanie jej metody onMeasure (), która jest odpowiedzialna za określenie rozmiaru widoku podczas cyklu układania, i naprawienie jej do szerokości i wysokości ekranu. Nie jest to jednak poprawne, ponieważ nie uwzględnia miejsca zajmowanego przez paski menu, więc kontener będzie faktycznie wyższy, niż wygląda na ekranie (ze wszystkimi dziwnymi efektami ubocznymi, takimi jak znikanie dzieci w niewidocznych obszarach ekran).
Matthias
Znalazłem właściwe rozwiązanie, zobacz moją odpowiedź poniżej.
Matthias

Odpowiedzi:

312

Znalazłem rozwiązanie:

W swojej aktywności, która ma Theme.Dialogustawiony styl, wykonaj następujące czynności:

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

    setContentView(R.layout.your_layout);

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

Ważne jest, aby dzwonić Window.setLayout() po telefonie setContentView(), w przeciwnym razie to nie zadziała.

Matthias
źródło
5
Dzięki, zaoszczędziłem czas, nigdzie bym tego nie pomyślał! ale masz pomysł, dlaczego musimy jawnie określić w kodzie, dlaczego fill_parent nie działa przez xml dla działań z oknem dialogowym motywu?
sob.
3
Moje okno dialogowe nie wypełnia szerokości, nie przez XML i nie za pomocą tej metody. Jem paznokcie.
eitama
6
I to jest:import android.view.ViewGroup.LayoutParams;
11
FILL_PARENT jest teraz przestarzałe, zamiast tego użyj MATCH_PARENT
AlexV,
4
Nie wypełnia całego ekranu, jest tak, jakby miał małą wyściółkę z każdej strony.
Machado,
66

Możesz dodać te wartości do swojego stylu android: windowMinWidthMajor i 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
źródło
2
najłatwiejsze rozwiązanie. Współpracuje również z biblioteką obsługującą appcompat. Dzięki.
Muhammad Saqib
To powinna zostać zaakceptowana odpowiedź. Najbardziej odpowiedni i czysty sposób, aby to zrobić. Rozważ użycie parent = "@ style / Theme.AppCompat.Light.Dialog"
Kirill Karmazin,
Wydaje się, że powinno działać, ale nie dla mnie. Hmm, ciekawe dlaczego. Być może coś się zmieniło od 2014 roku.
Scott Biggs
53

Chcę tylko wypełnić tylko 80% ekranu, ponieważ zrobiłem to poniżej

        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

działa tylko wtedy, gdy wstawię linię getwindow (). setLayout ... poniżej setContentView (..)

dzięki @Matthias

Padma Kumar
źródło
11

Umieść swój dialog_custom_layout.xml w RelativeLayout zamiast w jakimkolwiek innym układzie.

Ayan
źródło
1
To samo tutaj, szerokość i wysokość były całkowicie błędne i nie można było dowiedzieć się, jak to naprawić. Konwersja układu głównego na RelativeLayout rozwiązała również moje problemy!
SharpMobileCode,
8

Dla dialogu To może być pomocne dla kogoś. Chcę, aby okno dialogowe zajmowało całą szerokość ekranu. dużo szukałem, ale nic nie okazało się przydatne. W końcu to zadziałało:

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

po dodaniu tego, moje okno dialogowe pojawia się na całej szerokości ekranu.

Rahul Sharma
źródło
5

Ta odpowiedź to obejście dla tych, którzy używają „Theme.AppCompat.Dialog” lub innych elementów potomnych „Theme.AppCompat.Dialog”, takich jak „Theme.AppCompat.Light.Dialog”, „Theme.AppCompat.DayNight.Dialog” itp. Sam muszę używać okna dialogowego AppCompat, ponieważ używam AppCompatActivity jako rozszerzenia dla wszystkich moich działań. Pojawi się problem, który spowoduje, że okno dialogowe będzie miało wypełnienie ze wszystkich stron (u góry, po prawej, u dołu i po lewej), jeśli użyjemy zaakceptowanej odpowiedzi.

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

    setContentView(R.layout.your_layout);

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

Dodaj ten kod do stylu swojego działania

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

Jak możesz zauważyć, problem, który generuje wypełnienie naszego okna dialogowego to „android: windowBackground”, więc tutaj ustawiam tło okna na null.

HendraWD
źródło
2

Ustaw minimalną szerokość w górnym układzie.

android:minWidth="300dp"

Na przykład:

<?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
źródło
2

Odpowiedź Matthiasa jest w większości poprawna, ale nadal nie wypełnia całego ekranu, ponieważ ma małe wypełnienie z każdej strony (wskazane przez @Holmes). Oprócz jego kodu mogliśmy to naprawić, rozszerzając styl Theme.Dialog i dodając kilka takich atrybutów.

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

Następnie po prostu deklarujemy Aktywność z motywem ustawionym na MyDialog:

<activity
    android:name=".FooActivity"
    android:theme="@style/MyDialog" />
DYS
źródło
1

Byłoby to pomocne dla kogoś takiego jak ja. Utwórz własny styl okna dialogowego:

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

W AndroidManifest.xmlmotywie zestawu plików dla pożądanej aktywności:

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

To wszystko, nie ma potrzeby programowego wywoływania metod.

Stanojkovic
źródło
nadal pokazuj wypełnienie z każdej strony (góra, prawo, dół i lewo) i jeśli będziemy musieli również pokazać pasek stanu, to rozwiązanie zawiedzie
HendraWD
Sprawdź stackoverflow.com/a/39590004/3940133, jeśli masz wyściółkę po obu stronach
HendraWD,
0

W Twoim pliku manifestu, w którym zdefiniowano naszą działalność

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

bez paska akcji

<activity android:name=".YourPopUpActivity"
            android:theme="@android:style/Theme.Holo.Dialog.NoActionBar"/>
Makvin
źródło