2010-12-10 4 views
44
AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setTitle("Title"); 
     builder.setItems(items, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int item) { 
       Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     AlertDialog alert = builder.create(); 

Ich verwende den obigen Code, um einen Alarmdialog anzuzeigen. Standardmäßig füllt es den Bildschirm in Breite und wrap_content in Höhe.
Wie kann ich die Breite und Höhe des Standard-Warndialogs steuern?
Ich habe versucht:Wie können Sie die Breite und Höhe des Standardalarmdialogs in Android steuern?

alert.getWindow().setLayout(100,100); // It didn't work. 

wie das Layout params auf den Alarm-Fenster zu erhalten und manuell an die Breite und die Höhe?

Antwort

148

nur eine geringe Änderung in Sat-Code, setzen Sie das Layout nach Show() -Methode des Alertdialog.

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
builder.setView(layout); 
builder.setTitle("Title"); 
alertDialog = builder.create(); 
alertDialog.show(); 
alertDialog.getWindow().setLayout(600, 400); //Controlling width and height. 

Oder Sie können es auf meine Art tun.

alertDialog.show(); 
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); 

lp.copyFrom(alertDialog.getWindow().getAttributes()); 
lp.width = 150; 
lp.height = 500; 
lp.x=-170; 
lp.y=100; 
alertDialog.getWindow().setAttributes(lp); 
+0

Können Sie den Text zentrieren? –

+0

@ingo: Ja, Sie können, erstellen Sie eine XML gehören zum Dialogfeld und in diesem XML-Design Ihren Text wie dialog.setContentView (R.layout.dialog); und in XML können Sie alles mit dem Text machen. – PiyushMishra

+0

@PiyushMishra Kann ich das min/max Width-Attribut programmgesteuert setzen ... – aProgrammer

4

Ich weiß nicht, ob Sie die Standardhöhe/-breite von AlertDialog ändern können, aber wenn Sie dies tun möchten, können Sie dies tun, indem Sie Ihren eigenen benutzerdefinierten Dialog erstellen. Sie müssen nur android:theme="@android:style/Theme.Dialog" in der android manifest.xml für Ihre Aktivität geben und können das gesamte Layout nach Ihren Anforderungen schreiben. Sie können die Höhe und Breite Ihres benutzerdefinierten Dialogfelds über die Android-Ressourcen-XML festlegen.

+0

Es könnte funktionieren, aber ich wollte nicht, eine andere Aktivität hinzufügen. Ich habe die Lösung gepostet, die ich benutzt habe. Vielen Dank. – sat

+0

Ja, die obige Methode funktioniert auch, um Elemente im Popup-Stil anzuzeigen oder Alarmdialog zu sagen. Habe es in einem der Projekte ausprobiert. – sat

+0

Vergleicht nur 2 Möglichkeiten, 1. Mit AlertDialog.builder und einem anderen 2. activity mit Theme Dialog, zweite ist bessere Lösung, nur Nachteil, wenn man einige Ergebnisse zurück in die Hintergrundansicht senden muss, muss startActivityForResult, seit Elemente verwenden (Ansichten) im Hintergrund Aktivität sind nicht verfügbar. – sat

24

Ok, ich kann die Breite und Höhe mit Builder-Klasse steuern. I verwendet

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
builder.setView(layout); 
builder.setTitle("Title"); 
AlertDialog alertDialog = builder.create(); 
alertDialog.getWindow().setLayout(600, 400); //Controlling width and height. 
alertDialog.show(); 
+0

Ausgezeichneter Fang. Nach create() ist * WAY * besser als nach show(), vor allem bei Verwendung von DialogFragments! –

+0

Sie verwenden nicht die Builder-Klasse, um die Breite/Höhe zu ändern, nur das alertDialog-Objekt – for3st

+2

es funktionierte nicht für mich zwischen dem Erstellen und der Show, sondern erst nach der Show. –

7

Dies funktioniert auch durch .getWindow().setLayout(width, height) nach show()

alertDialogBuilder 
      .setMessage("Click yes to exit!") 
      .setCancelable(false) 
      .setPositiveButton("Yes",new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog,int id) { 
        // if this button is clicked, close 
        // current activity 
        MainActivity.this.finish(); 
       } 
       }) 
      .setNegativeButton("No",new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog,int id) { 
        // if this button is clicked, just close 
        // the dialog box and do nothing 
        dialog.cancel(); 
       } 
      }).show().getWindow().setLayout(600,500); 
8

Zugabe Bevor Sie versuchen, die Größe Post-Layout, erste Prüfung, welche Art Ihr Dialog mit anzupassen. Stellen Sie sicher, dass nichts in der Artbaum

<item name="windowMinWidthMajor">...</item> 
<item name="windowMinWidthMinor">...</item> 

setzt Wenn das passiert, ist es nur so einfach Ihren eigenen Stil der [Builder Konstruktor, der in einem themeResId nimmt] die Versorgung (http://developer.android.com/reference/android/app/AlertDialog.Builder.html#AlertDialog.Builder(android.content.Context, int)) verfügbar API 11+

<style name="WrapEverythingDialog" parent=[whatever you were previously using]> 
    <item name="windowMinWidthMajor">0dp</item> 
    <item name="windowMinWidthMinor">0dp</item> 
</style> 
+0

Danke, viel einfacher als programmgesteuert. – v1k

+0

Wie kann ich das von einem Dialog verwendete Thema finden? Ich kann es nur erraten. –

+0

Funktioniert super danke – Shirane85

0

Wenn Sie die dynamische Breite und Höhe basierend auf Ihrem Geräterahmen hinzufügen möchten, können Sie diese Berechnungen durchführen und die Höhe und Breite zuweisen.

AlertDialog.Builder builderSingle = new 
AlertDialog.Builder(getActivity()); 
builderSingle.setTitle("Title"); 

final AlertDialog alertDialog = builderSingle.create(); 
alertDialog.show(); 

Rect displayRectangle = new Rect(); 
Window window = getActivity().getWindow(); 

window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle); 

alertDialog.getWindow().setLayout((int)(displayRectangle.width() * 
0.8f), (int)(displayRectangle.height() * 0.8f)); 

P. S: Zeigen Sie den Dialog zuerst und dann versuchen, das Fenster des Layout zu ändern Attribute

Verwandte Themen