Ekranı doldurmak için bir Dialog stili etkinlik penceresi nasıl alabilirim?


142

İletişim teması ayarlanmış bir etkinlik kullanıyorum ve tam ekran olmasını istiyorum. Pencereyi manuel olarak tam genişlik ve yüksekliğe genişletmek için WindowManager'dan geçerek her türlü şeyi denedim, ancak hiçbir şey çalışmıyor.

Görünüşe göre, bir iletişim penceresi (veya iletişim kutusu temalı bir etkinlik) yalnızca içeriğine göre genişler, ancak bu her zaman işe yaramaz. Örneğin, genişliği ve yüksekliği FILL_PARENT olarak ayarlanmış bir ilerleme çubuğu çemberi gösteriyorum (düzen kabı da öyle), ancak yine de iletişim kutusu ekranı doldurmak yerine çok daha küçük ilerleme çubuğunu sarar.

Bir iletişim penceresinin içinde küçük bir şey görüntülemenin bir yolu olmalı, ancak içeriği de yeniden boyutlandırılmadan tam ekran boyutuna genişletilsin mi?


2
İlginç not: Düzen kabının genişliğini ve yüksekliğini piksel cinsinden gerçek bir değere ayarlarken iletişim kutusu buna göre yeniden boyutlandırılır. Ancak FILL_PARENT olarak ayarlandığında, o zaman ...
Matthias

Gerçekten mi? Etkinliğin somutlaştırıldığı düzen, dolgu_ekleminin yüksekliğine ve genişliğine ayarlanmış bir üst Relative veya LinearLayout etiketine sahip mi? Bir iletişim temasıyla birkaç etkinlik uyguladım ve tüm ekranı kaplamakla ilgili bir sorun yaşamadım.
MattC

Evet, etkinliğin hem genişlik hem de yükseklik için FILL_PARENT olarak ayarlanmış bir LinearLayout öğesi var.
Matthias

Sorunu bir geçici çözüm kullanarak çözdüm, ancak bu iyi bir çözüm olmadığından, soruyu açık bırakacağım. Yaptığım şey, LinearLayout'u alt sınıflamak ve bir düzenleme döngüsü sırasında görünümün boyutunu belirlemekten sorumlu olan ve ekran genişliğine ve yüksekliğine sabitleyen onMeasure () yöntemini geçersiz kılmaktı. Bu doğru değil, çünkü bu menü çubuklarının kapladığı alanı hesaba katmıyor, bu yüzden kap aslında ekranda göründüğünden daha uzun olacak (çocuklar gibi görünmeyen alanlarda kaybolan tüm garip yan etkilerle) ekran).
Matthias

Doğru çözümü buldum, cevabımı aşağıya bakın.
Matthias

Yanıtlar:


312

Çözümü buldum:

Theme.DialogStil ayarlanmış olan etkinliğinizde şunları yapın :

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

    setContentView(R.layout.your_layout);

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

Bu çağrı önemlidir Window.setLayout() sonra aramak setContentView(), aksi takdirde iş olmaz.


5
Teşekkürler, zamanımı kurtardım, hiçbir yerde bunu çözemezdim! ancak neden kodda açıkça belirtmemiz gerektiğine dair herhangi bir fikir, neden fill_parent tema iletişim kutusundaki etkinlikler için xml ile çalışmaz?
sat

3
Diyalog pencerem genişliği XML tarafından değil, bu yöntemle doldurmuyor. Tırnaklarımı yiyorum.
eitama

6
Ve bu:import android.view.ViewGroup.LayoutParams;

11
FILL_PARENT kullanım MATCH_PARENT yerine, artık önerilmemektedir
AlexV

4
Tüm ekranı doldurmuyor, her tarafta küçük bir dolgu var gibi.
Machado

66

Bu değerleri stil androidinize ekleyebilirsiniz: windowMinWidthMajor ve 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
en kolay çözüm. Ayrıca, appcompat destek kitaplığıyla da çalışıyor. Teşekkürler.
Muhammed Saqib

Bu cevap kabul edilmelidir. Bunu yapmanın en doğru ve temiz yolu. Parent = "@ style / Theme.AppCompat.Light.Dialog" 'yu ​​kullanmayı düşünün
Kirill Karmazin

Bu işe yarayacak gibi görünüyor, ama benim için değil. Hmm, nedenini merak ediyorum. Belki 2014'ten beri işler değişti.
Scott Biggs

53

Aşağıdaki gibi yaptığım için sadece ekranın sadece% 80'ini doldurmak istiyorum

        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

sadece getwindow (). setLayout ... satırını setContentView (..) altına koyduğumda çalışır

teşekkürler @Matthias


11

Dialog_custom_layout.xml dosyasını başka bir düzen yerine RelativeLayout içine sarın .


1
Aynı şekilde, Genişlik ve Yükseklik tamamen yanlıştı ve nasıl düzeltileceğini anlayamadı. Kök düzenini bir RelativeLayout'a dönüştürmek de sorunlarımı düzeltti!
SharpMobileCode

8

İletişim Kutusu için Bu birisi için yararlı olabilir. Bir iletişim kutusunun tam ekran genişliğini almasını istiyorum. çok aradım ama hiçbir şey yararlı bulunamadı. Sonunda bu benim için çalıştı:

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

bunu ekledikten sonra, diyalogum tam ekran genişliğinde görünür.


5

Bu yanıt, "Theme.AppCompat.Dialog" veya "Theme.AppCompat.Light.Dialog", "Theme.AppCompat.DayNight.Dialog" vb. Gibi diğer "Theme.AppCompat.Dialog" torunları kullananlar için bir çözümdür. Kendim AppCompat iletişim kutusunu kullanmak zorunda çünkü tüm aktivitelerim için AppCompatActivity'yi kullanıyorum. Kabul edilen cevabı kullanırsak iletişim kutusunun her iki tarafta (üst, sağ, alt ve sol) dolgu yapmasına neden olan bir sorun olacaktır.

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

    setContentView(R.layout.your_layout);

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

Etkinliğinizin stiline bu kodu ekleyin

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

Fark edebileceğiniz gibi, bizim iletişim için dolgu oluşturmak sorunu "android: windowBackground", bu yüzden burada pencere arka plan null yapmak.


2

En üstteki düzende minimum genişlik ayarlayın.

android:minWidth="300dp"

Örneğin:

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

Matthias'ın cevabı çoğunlukla doğrudur, ancak her iki tarafta da küçük bir dolgu olduğundan (@Holmes'in işaret ettiği gibi) tüm ekranı doldurmuyor. Koduna ek olarak, Theme.Dialog stilini genişleterek bunu düzeltebilir ve bunun gibi bazı özellikler ekleyebiliriz.

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

Ardından, temayı şu şekilde ayarlanmış olarak Etkinlik bildiririz MyDialog:

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

1

Bu benim gibi biri için yararlı olur. Özel iletişim stili oluşturma:

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

In AndroidManifest.xmlistediği etkinliği için dosya kümesi tema:

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

Hepsi bu, metotları programsal olarak çağırmaya gerek yok.


hala her iki tarafta da dolgu (üst, sağ, alt ve sol) gösteriyor ve durum çubuğunu da göstermemiz gerekiyorsa, bu çözüm başarısız olacaktır
HendraWD

Her iki tarafta da dolgu varsa stackoverflow.com/a/39590004/3940133
adresini

0

Faaliyetimizin tanımlandığı manifest dosyanızda

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

işlem çubuğu olmadan

<activity android:name=".YourPopUpActivity"
            android:theme="@android:style/Theme.Holo.Dialog.NoActionBar"/>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.