Bir uyarı iletişim kutusu ekran boyutunun% 90'ını nasıl doldurur?


305

Özel bir uyarı iletişim kutusu oluşturabilir ve görüntüleyebilirim, ancak android:layout_width/height="fill_parent"iletişim kutusunda xml'de bile sadece içerikler kadar büyük.

Ne istiyorum belki 20 piksel bir dolgu hariç tüm ekranı dolduran iletişim kutusu. Sonra iletişim kutusunun bir parçası olan görüntü otomatik olarak fill_parent ile tam iletişim boyutuna uzanır.

Yanıtlar:


355

Bu tartışma grubu gönderisindeki Android platformu geliştiricisi Dianne Hackborn'a göre Dialogs, Window'un üst düzey düzen genişliğini ve yüksekliğini olarak ayarladı WRAP_CONTENT. İletişim Kutusunu büyütmek için bu parametreleriMATCH_PARENT .

Demo kodu:

    AlertDialog.Builder adb = new AlertDialog.Builder(this);
    Dialog d = adb.setView(new View(this)).create();
    // (That new View is just there to have something inside the dialog that can grow big enough to cover the whole screen.)

    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
    lp.copyFrom(d.getWindow().getAttributes());
    lp.width = WindowManager.LayoutParams.MATCH_PARENT;
    lp.height = WindowManager.LayoutParams.MATCH_PARENT;
    d.show();
    d.getWindow().setAttributes(lp);

Özelliklerin, İletişim Kutusu gösterildikten sonra ayarlandığını unutmayın. Sistem, ayarlandıkları zaman konusunda titizdir. (Düzen motorunun, iletişim kutusu ilk kez görüntülendiğinde bunları ayarlaması gerektiğini düşünüyorum.)

Theme.Dialog'u genişleterek bunu yapmak daha iyi olurdu, o zaman setAttributes'ı ne zaman arayacağınız hakkında bir tahmin oyunu oynamak zorunda kalmazsınız. (İletişim kutusunun uygun bir açık veya koyu temayı veya Honeycomb Holo temasını otomatik olarak benimsemesi biraz daha fazla iş olmasına rağmen. Bu http://developer.android.com/guide/topics/ui/themes'e göre yapılabilir . html # SelectATheme )


5
Cevabı anlamıyor muyum yoksa benim için işe yaramıyor.
David Morales

4
Diyalogların wrap_content genişliğinde olduğu doğru görünmüyor. İşler daralır ve kesilir. İletişim kutusunun önceden belirlenmiş bir maksimum genişliğe ayarlandığı görülüyor.
Peter Ajtai

21
Bunun soruyu nasıl cevapladığını anlamıyorum? @Nmr tarafından önerilen kod, İletişim Kutusunu ekranın% 90'ı yapar mı? Çünkü görmüyorum. Diyalog sadece fill_width olarak ayarlanmış, bu yüzden% 90 değil% 100, değil mi?
Ted

4
@Ted, AlertDialog tarafından kullanılan temanın bir marjı vardır. Böylece sonuç ekranın kenarına ulaşmaz, yaklaşık% 90'ını doldurur. (Kesinlikle tam olarak% 90 değil, sadece% 90 estetik bir yaklaşım)
nmr

8
Sadece d.getWindow () çağrısı olsun. GetAttributes (). Width = WindowManager.LayoutParams.FILL_PARENT; show () çağırmadan önce hile yapacak. Ayrıca, diyalogun arka planı saydam hale geldiği için verilen yöntemle ilgili bazı sorunlar yaşadım. ()) CopyFrom (() kaldırılır kaldırılmaz sorun düzeltildi
Alexey

183

Özel iletişim düzeni düzeninizi RelativeLayoutyerine içine almayı deneyin LinearLayout. Bu benim için çalıştı.


2
benim için de var. Herkes nedenini açıklayabilir !!
Rozina

RelativeLayout'un çalışması gerektiği gibi mi yoksa ortadan kalkabilecek mutlu bir kaza mı?
Yetti99

10
2019 ve bu hala çalışıyor. Şerefe! Gerçekten kabul edilen cevap olmalı.
TaylanUB

@cvarsendan cevabı açıklayabilir misiniz? Bu benim için çalıştı. Teşekkür ederim!
Jaco

OMG, My RecyclerView hiçbir zaman tam yükseklik görüntülemez veya yüksekliği her zaman 0 olur ve bununla birlikte birçok çözümü denedikten bir gün sonra mükemmel çalışır. RelativeLayout neden diğerleri?
leegor

85

İletişim penceresinde FILL_PARENT belirtilmesi, diğerlerinin önerdiği gibi, benim için işe yaramadı (Android 4.0.4'te), çünkü tüm ekranı doldurmak için siyah iletişim arka planını uzattı.

İyi çalışan, minimum görüntüleme değerini kullanmak, ancak kod içinde belirtmektir, böylece iletişim kutusu ekranın% 90'ını alır.

Yani:

Activity activity = ...;
AlertDialog dialog = ...;

// retrieve display dimensions
Rect displayRectangle = new Rect();
Window window = activity.getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle);

// inflate and adjust layout
LayoutInflater inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.your_dialog_layout, null);
layout.setMinimumWidth((int)(displayRectangle.width() * 0.9f));
layout.setMinimumHeight((int)(displayRectangle.height() * 0.9f));

dialog.setView(layout);

Genel olarak, genişliğin ayarlanması çoğu durumda yeterli olmalıdır.


Bu, 4.0 ve üstü sürümlerde tamamen işe yaramıyor gibi görünüyor. Ekranın% 90'ını doldurmaz. Neden olduğu hakkında bir fikrin var mı? Bunu 4.0 ile bir Motorola Xoom'da yapıyorum
Ryan Gray

@RyanGray Benim için güncellenmiş işletim sistemine sahip bir Samsung Nexus S üzerinde çalışıyor. Ek bilgi olmadan ne yazık ki size yardımcı olamıyorum.
koma

83

Set android:minWidthve android:minHeightözel görünüm xml. Bunlar uyarıyı yalnızca içerik boyutunu sarmaya zorlamayabilir. Böyle bir görünüm kullanmak şunları yapmalıdır:

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:minWidth="300dp" 
  android:minHeight="400dp">
  <ImageView
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:background="@drawable/icon"/>
</LinearLayout>

3
Evet bununla belirli bir boyuta ayarlayabilirim, ancak ekran boyutunun eksi örneğin 20 piksellik bir dolgu olmasını istiyorum. Veya genişlik = ekran genişliğinin% 90'ı.
Fabian

4
I yoğunluktan bağımsız pikseller her zaman ölçeklenir, böylece herhangi bir ekran 320x480dp olur, böylece 300x460dp görünüm her durumda 20dp dolgu olur. Alternatif olarak ekranın boyutunu şu şekilde bulabilirsiniz: Display display = ((WindowManager) getSystemService (Context.WINDOW_SERVICE)). GetDefaultDisplay (); int width = display.getWidth (); ve maxWidth ve maxHeight değerlerini buna göre ayarlayın.
jqpubliq

5
Hmm dekorasyondan dp kavramını anlıyorum. Ama ekran oranı 16: 9 veya 4: 3 ise? Th dp düzensiz olarak gerilecek mi?
Fabian

2
Hayır, dp çözünürlüğü yalnızca ekran oranı 2: 3 ise 320x480 olacaktır, bu nedenle bu yöntem çalışmaz.
mhsmith

21
ne, bu cevap neden bu kadar çok kez onaylandı? Kullanıcının hangi cihaz boyutunu kullandığına dair hiçbir önemi olmadığı için bu korkunç bir çözümdür.
Jin

70

Daha da basit:

int width = (int)(getResources().getDisplayMetrics().widthPixels*0.90);
int height = (int)(getResources().getDisplayMetrics().heightPixels*0.90);

alertDialog.getWindow().setLayout(width, height);

küçük not: getResources (), Activity bağlamında kullanılabilir.
nat101

Bu yanıt, onCreateaygıt döndürüldükten sonra bir iletişim kutusu yeniden oluşturulmaya çalışılması senaryosunda çok yardımcı oldu . Bu durumda, mizanpajdaki hiçbir şeyin genişliğine / yüksekliğine güvenemeyiz, çünkü henüz oluşturulmamıştır; ancak cihazın fiziksel genişliği / yüksekliği hala kullanılabilir.
Tim Biegeleisen

4
Sadece bir boyutu değiştirmek istiyorsanız ViewGroup.LayoutParams.WRAP_CONTENT, parametrelerden biri olarak geçin
Vadim Kotov

53
dialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);

1
Bu benim için çalıştı ve bu şekilde çalışan MonoDroid'e çevirmek kolaydı (burada d yeni bir iletişim kutusudur): d.Window.SetLayout (WindowManagerLayoutParams.FillParent, WindowManagerLayoutParams.FillParent);
Temmuz

10
Ancak% 90,% 100 ile aynı değildir. FILL_PARENT genişliği% 90 değil,% 100 tüm genişliği doldurduğunu gösterir. Sağ?
Ted

@Ted Haklısın. Sen yerini alabilir FILL_PARENTgeçerli ekranın genişliğinin% 90 olarak hesaplanmış genişliği ile. Ama cevabı seviyorum çünkü diğerlerinden daha kolay.
HRJ

26

Buradaki diğer cevapların hepsi mantıklı, ancak Fabian'ın ihtiyaç duyduğu şeyleri karşılamadı. İşte benim bir çözümüm. Mükemmel bir çözüm olmayabilir ama benim için çalışıyor. Tam ekranda bir iletişim kutusu görüntüler, ancak üstte, altta, solda veya sağda bir dolgu belirleyebilirsiniz.

Öncelikle bunu res / değerleri / styles.xml dosyasına koyun:

<style name="CustomDialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@color/Black0Percent</item>
    <item name="android:paddingTop">20dp</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:backgroundDimEnabled">false</item>
    <item name="android:windowIsFloating">false</item>
</style>

Gördüğünüz gibi orada android var: paddingTop = 20dp temelde ihtiyacınız olan şey. Android: windowBackground = @ renkli / Black0Percent sadece renk kodu benim color.xml deklare olduğu

res / değerler / color.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="Black0Percent">#00000000</color>
</resources>

Bu Renk kodu, İletişim Kutusunun varsayılan pencere arka planını% 0 şeffaflık rengiyle değiştirmek için bir kukla görevi görür.

Ardından özel iletişim düzeni düzenini res / layout / dialog.xml oluşturun

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/dialoglayout"
    android:layout_width="match_parent"
    android:background="@drawable/DesiredImageBackground"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/edittext1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:textSize="18dp" />

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Dummy Button"
        android:textSize="18dp" />

</LinearLayout>

Son olarak, dialog.xml dosyamızı kullanan özel görünümü ayarlayan iletişim kutumuz:

Dialog customDialog;
LayoutInflater inflater = (LayoutInflater) getLayoutInflater();
View customView = inflater.inflate(R.layout.dialog, null);
// Build the dialog
customDialog = new Dialog(this, R.style.CustomDialog);
customDialog.setContentView(customView);
customDialog.show();

Sonuç: CustomDialog adlı styles.xml dosyasında iletişim kutusunun temasını geçersiz kılmaya çalıştım. İletişim penceresi düzenini geçersiz kılar ve bana bir dolgu oluşturma ve arka planın opaklığını değiştirme şansı verir. Mükemmel bir çözüm olmayabilir ama umarım size yardımcı olur .. :)


jellybean için çalışıyor ben şimdi diğer bulids test etmek mümkün oldum
Nasz Njoka Sr.Tem

En temiz ve en zarif çözüm gibi görünüyor. Kitkat 4.4 ve 4.3 üzerinde çalışır.
David

Özel bir iletişim kutusu var ve hiçbir şey bunu görene kadar çalışıyordu, sihir, özel bir iletişim kutusundaki TÜM BÜYÜSÜ (bu genişletir DialogFragment) yaptığınızda gelir: Dialog customDialog = new Dialog(context, STYLE);teşekkürler, GERÇEKTEN, teşekkürler.
Sierisimo

Yararlı olduğunu bilmek güzel :)
icaneatclouds

Bu iletişim penceresi için bir cazibe gibi çalışır! (ayrıca orijinal pencerenin gri renkte görünmesi için bir Black60Percent tanımlayabilirsiniz) Talihsiz yan etki, iletişim kutusundaki tüm görünümlerimin iletişim için ayarladığım
dolguları devralmasıdır

25

(SADECE) pencereler iletişim genişliği için yüzde değerini kullanabilirsiniz.

Holo Teması'ndan bu örneğe bakın:

<style name="Theme.Holo.Dialog.NoActionBar.MinWidth">
    <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
    <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
</style>

 <!-- The platform's desired minimum size for a dialog's width when it
     is along the major axis (that is the screen is landscape).  This may
     be either a fraction or a dimension. -->
<item type="dimen" name="dialog_min_width_major">65%</item>

Tek yapmanız gereken bu temayı genişletmek ve "Büyük" ve "Küçük" değerlerini% 65 yerine% 90 olarak değiştirmek.

Saygılarımızla.


1
Bunu iletişim
kutusuyla

23

Aşağıdaki benim için iyi çalıştı:

    <style name="MyAlertDialogTheme" parent="Base.Theme.AppCompat.Light.Dialog.Alert">
        <item name="windowFixedWidthMajor">90%</item>
        <item name="windowFixedWidthMinor">90%</item>
    </style>

(not: windowMinWidthMajor / Minor, önceki yanıtlarda önerildiği gibi hile yapmadı. Diyaloglarım içeriğe bağlı olarak boyutları değiştirmeye devam etti)

ve sonra:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.MyAlertDialogTheme);

4
Şimdiye kadarki en iyi cevap. Benim için mükemmel çalıştı!
Pawan

Merak ediyorum: yüzde olarak ayarlanan bu özel boyutların değerini kod yoluyla nasıl alabilirim?
android geliştirici

19

Gerçek% 90 hesaplama ile çözüm:

@Override public void onStart() {
   Dialog dialog = getDialog();
   if (dialog != null) {
     dialog.getWindow()
        .setLayout((int) (getScreenWidth(getActivity()) * .9), ViewGroup.LayoutParams.MATCH_PARENT);
   }
}

nerede getScreenWidth(Activity activity)tanımlanır (en iyi bir Utils sınıfına konur):

public static int getScreenWidth(Activity activity) {
   Point size = new Point();
   activity.getWindowManager().getDefaultDisplay().getSize(size);
   return size.x;
}

iletişim kutusu gibi işlev görmesi gereken bir uygulama için cazibe gibi çalışır

Ben dizi endeksi bu konuda bağlı alıyorum :(
Dr. aNdRO

@ Dr.aNdRO nasıl? Hangi çizgi? Bu kod parçasının başka bir şey olmadığına emin misiniz?
Mehmet K

.setLayout () Bu satıra alıyorum, WRAP CONTENT olarak değiştirdiğimde bu iyi çalışıyor
Dr. aNdRO


10

Cihaz genişliğini edinin:

public static int getWidth(Context context) {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    WindowManager windowmanager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    windowmanager.getDefaultDisplay().getMetrics(displayMetrics);
    return displayMetrics.widthPixels;
}

ardından bunu cihazın% 90'ını diyalog yapmak için kullanın,

Dialog filterDialog = new Dialog(context, R.style.searchsdk_FilterDialog);

filterDialog.setContentView(R.layout.searchsdk_filter_popup);
initFilterDialog(filterDialog);
filterDialog.setCancelable(true);
filterDialog.getWindow().setLayout(((getWidth(context) / 100) * 90), LinearLayout.LayoutParams.MATCH_PARENT);
filterDialog.getWindow().setGravity(Gravity.END);
filterDialog.show();

8

Bunu göstermek için önce iletişim pencerenizin yüksekliğini ve genişliğini ayarlamanız gerekir (dialog.show ())

yani, böyle bir şey yapın:

dialog.getWindow().setLayout(width, height);

//then

dialog.show()

Benim için boyut belirlemez. API> = 21.
Odys

7

Şimdiye kadar düşünebildiğim en basit yol -

Diyalog pencereniz dikey bir LinearLayout öğesinden yapılmışsa, ekranın tüm yüksekliğini kaplayacak bir "yükseklik doldurma" kukla görünümü ekleyin.

Örneğin -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:weightSum="1">

    <EditText
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:id="@+id/editSearch" />

    <ListView
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:id="@+id/listView"/>


   <!-- this is a dummy view that will make sure the dialog is highest -->
   <View
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:layout_weight="1"/>

</LinearLayout>

Dikkat android:weightSum="1"LinearLayout sıfatlarını ve android:layout_weight="1"kukla View'in özniteliklerde


Güzel! Bu, web görünümümün onPageFinished'den sonra son derece kısa bir şekilde başlamasını ve tam yüksekliğe kadar genişlemesini engelliyor. Kudos!
Nancy

6

Bunu göstermek için önce iletişim pencerenizin yüksekliğini ve genişliğini ayarlamanız gerekir (dialog.show ())

yani, böyle bir şey yapın:

dialog.getWindow().setLayout(width, height);

//then

dialog.show()

Bu kodu almak, bazı değişiklikler yaptım:

dialog.getWindow().setLayout((int)(MapGeaGtaxiActivity.this.getWindow().peekDecorView().getWidth()*0.9),(int) (MapGeaGtaxiActivity.this.getWindow().peekDecorView().getHeight()*0.9));

ancak, cihaz konumunu değiştirdiğinde iletişim kutusu boyutları değişebilir. Metrikler değiştiğinde belki de kendi başınıza halletmeniz gerekir. PD: peekDecorView, etkinlikteki mizanpajın düzgün şekilde başlatıldığını gösterir, aksi takdirde

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int wwidth = metrics.widthPixels;

ekran boyutunu elde etmek için


6

İletişim nesnenizi başlatın ve içerik görünümünü ayarlayın. Bunu yap ve tadını çıkar.

(genişlik% 90'ı araç çubuğunun üzerinde olacağı için% 90'ı genişliğe ve% 70'i yüksekliğe ayarlıyorsam)

DisplayMetrics displaymetrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int width = (int) ((int)displaymetrics.widthPixels * 0.9);
int height = (int) ((int)displaymetrics.heightPixels * 0.7);
d.getWindow().setLayout(width,height);
d.show();

4

Cevabım koma'ya dayanıyor, ancak onStart'ı geçersiz kılmak zorunda değil, sadece yeni parçalar oluşturduğunuzda neredeyse her zaman varsayılan olarak geçersiz kılınan onCreateView.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.your_fragment_layout, container);

    Rect displayRectangle = new Rect();
    Window window = getDialog().getWindow();
    window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle);

    v.setMinimumWidth((int)(displayRectangle.width() * 0.9f));
    v.setMinimumHeight((int)(displayRectangle.height() * 0.9f));

    return v;
}

Android 5.0.1'de test ettim.


3

İşte özel iletişim kutusunun genişliği için benim varyant:

DisplayMetrics displaymetrics = new DisplayMetrics();
mActivity.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int width = (int) (displaymetrics.widthPixels * (ThemeHelper.isPortrait(mContext) ? 0.95 : 0.65));

WindowManager.LayoutParams params = getWindow().getAttributes();
params.width = width;
getWindow().setAttributes(params);

Yani cihazın yönüne bağlı olarak (ThemeHelper.isPortrait(mContext) ) iletişim kutusunun genişliği ya% 95 (portre modu için) ya da% 65 (manzara için) olacaktır. Yazarın sorduğu biraz daha fazla ama birisi için yararlı olabilir.

İletişim Kutusu'ndan uzanan bir sınıf oluşturmanız ve bu kodu onCreate(Bundle savedInstanceState)yönteminize eklemeniz gerekir .

İletişim kutusunun yüksekliği için kod buna benzer olmalıdır.


Nedir ThemeHelper? Projemde bu sınıf yok.
Nemi

ThemeHelperihtiyaçlarım için sadece yardımcı bir sınıf. Yöntemi isPortrait(Context), cihazın ekran yönünün dikey mi yoksa yatay mı olduğunu döndürür.
Klanlar

iletişim kutusu yüklendikten sonra yönlendirmeyi değiştirirsek bu sorun olur, başlangıç ​​ayarını onCreate
iBabur'da

3
public static WindowManager.LayoutParams setDialogLayoutParams(Activity activity, Dialog dialog)
    {
        try 
        {
            Display display = activity.getWindowManager().getDefaultDisplay();
            Point screenSize = new Point();
            display.getSize(screenSize);
            int width = screenSize.x;

            WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
            layoutParams.copyFrom(dialog.getWindow().getAttributes());
            layoutParams.width = (int) (width - (width * 0.07) ); 
            layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
            return layoutParams;
        } 
        catch (Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }

3

Cevapların çoğu iyi ama hiçbiri benim için tam olarak işe yaramadı. Bu yüzden @nmr'den cevabı birleştirdim ve bunu aldım.

final Dialog d = new Dialog(getActivity());
        //  d.getWindow().setBackgroundDrawable(R.color.action_bar_bg);
        d.requestWindowFeature(Window.FEATURE_NO_TITLE);
        d.setContentView(R.layout.dialog_box_shipment_detail);

        WindowManager wm = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE); // for activity use context instead of getActivity()
        Display display = wm.getDefaultDisplay(); // getting the screen size of device
        Point size = new Point();
        display.getSize(size);
        int width = size.x - 20;  // Set your heights
        int height = size.y - 80; // set your widths

        WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
        lp.copyFrom(d.getWindow().getAttributes());

        lp.width = width;
        lp.height = height;

        d.getWindow().setAttributes(lp);
        d.show();

3
    ...
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    Dialog d = builder.create(); //create Dialog
    d.show(); //first show

    DisplayMetrics metrics = new DisplayMetrics(); //get metrics of screen
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
    int height = (int) (metrics.heightPixels*0.9); //set height to 90% of total
    int width = (int) (metrics.widthPixels*0.9); //set width to 90% of total

    d.getWindow().setLayout(width, height); //set layout

3
düzeni ayarlamadan önce iletişim kutusunu göstermek benim için çalışıyor.
Angel Koh

2

özelleştirilebilir iletişim kutusunu görüntülemek için CustomDialog gibi bir style @ style.xml kullanmanız gerekir.

<style name="CustomDialog" parent="@android:style/Theme.DeviceDefault.Light.Dialog">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@color/colorWhite</item>
        <item name="android:editTextColor">@color/colorBlack</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    </style>

ve bu stili Activity.java'da şu şekilde kullanın

Dialog dialog= new Dialog(Activity.this, R.style.CustomDialog);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.custom_dialog);

ve custom_dialog.xml dosyanız mizanpaj dizininizde olmalıdır

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="10dp"
    android:paddingRight="10dp">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="20dp"
        android:id="@+id/tittle_text_view"
        android:textColor="@color/colorBlack"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="10dp"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginLeft="20dp"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="20dp"
        android:layout_marginRight="20dp">

        <EditText
            android:id="@+id/edit_text_first"
            android:layout_width="50dp"
            android:layout_height="match_parent"
            android:hint="0"
            android:inputType="number" />

        <TextView
            android:id="@+id/text_view_first"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="5dp"
            android:gravity="center"/>

        <EditText
            android:id="@+id/edit_text_second"
            android:layout_width="50dp"
            android:layout_height="match_parent"
            android:hint="0"
            android:layout_marginLeft="5dp"
            android:inputType="number" />

        <TextView
            android:id="@+id/text_view_second"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="5dp"
            android:gravity="center"/>

    </LinearLayout>

</LinearLayout>

2

Kısıtlama Düzeni kullanıyorsanız , ekranın bir yüzdesini aşağıdakilerle doldurmak için içindeki herhangi bir görünümü ayarlayabilirsiniz:

layout_constraintWidth_percent = "0.8"

Örneğin, iletişim kutusunun içinde bir ScrollView varsa ve bunu ekran yüksekliğinin bir yüzdesine ayarlamak istiyorsanız. Bu şöyle olurdu:

<ScrollView
            android:id="@+id/scrollView"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintHeight_percent="0.8">

Umarım birine yardımcı olur !!


2

Sadece AlertDialog'a bu temayı ver

<style name="DialogTheme" parent="Theme.MaterialComponents.Light.Dialog.MinWidth">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="android:windowMinWidthMajor">90%</item>
    <item name="android:windowMinWidthMinor">90%</item>
</style>

1

İşte benim için kısa bir cevap (API 8 ve API 19 üzerinde test edildi).

Dialog mDialog;
View   mDialogView;
...
// Get height
int height = mDialog.getWindow()
.getWindowManager().getDefaultDisplay()
.getHeight();

// Set your desired padding (here 90%)
int padding = height - (int)(height*0.9f);

// Apply it to the Dialog
mDialogView.setPadding(
// padding left
0,
// padding top (90%)
padding, 
// padding right
0, 
// padding bottom (90%)
padding);

1
dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.WRAP_CONTENT);

0
    final AlertDialog alertDialog;

    LayoutInflater li = LayoutInflater.from(mActivity);
    final View promptsView = li.inflate(R.layout.layout_dialog_select_time, null);

    RecyclerView recyclerViewTime;
    RippleButton buttonDone;

    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(mActivity);
    alertDialogBuilder.setView(promptsView);

    // create alert dialog
    alertDialog = alertDialogBuilder.create();

    /**
     * setting up window design
     */
    alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);


    alertDialog.show();

    DisplayMetrics metrics = new DisplayMetrics(); //get metrics of screen
    mActivity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
    int height = (int) (metrics.heightPixels * 0.9); //set height to 90% of total
    int width = (int) (metrics.widthPixels * 0.9); //set width to 90% of total

    alertDialog.getWindow().setLayout(width, height); //set layout
    recyclerViewTime = promptsView.findViewById(R.id.recyclerViewTime);


    DialogSelectTimeAdapter dialogSelectTimeAdapter = new DialogSelectTimeAdapter(this);
    RecyclerView.LayoutManager linearLayoutManager = new LinearLayoutManager(this);
    recyclerViewTime.setLayoutManager(linearLayoutManager);
    recyclerViewTime.setAdapter(dialogSelectTimeAdapter);

    buttonDone = promptsView.findViewById(R.id.buttonDone);
    buttonDone.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            alertDialog.dismiss();

        }
    });

özel yükseklik iletişim ile özel iletişim
Neelu Agrawal
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.