2010-12-10 1 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(); 

Я использую приведенный выше код для отображения диалогового окна оповещений. По умолчанию он заполняет экран шириной и wrap_content по высоте.
Как я могу контролировать ширину и высоту диалогового окна предупреждения по умолчанию?
Я пробовал:Как контролировать ширину и высоту диалогового окна Alert Dial по умолчанию в Android?

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

Как получить Params макета на окне предупреждения и вручную установить ширину и высоту?

ответ

148

Только небольшое изменение Sat кодекса, установите раскладку после шоу() метод 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. 

Или вы можете сделать это на моем пути.

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); 
4

Я не знаю, можете ли вы изменить высоту/ширину по умолчанию AlertDialog, но если вы хотите сделать это, я думаю, вы можете сделать это, создав свой собственный диалог. Вы просто должны дать android:theme="@android:style/Theme.Dialog" в android manifest.xml для своей деятельности и можете написать весь макет согласно вашему требованию. вы можете установить высоту и ширину своего настраиваемого диалога из XML-файла Android.

+0

Это может работать, но я не хочу, чтобы добавить другую деятельность. Я опубликовал решение, которое я использовал. Спасибо. – sat 2010-12-15 07:21:55

+0

Да, приведенный выше метод также работает для отображения элементов в всплывающем стиле или говорит о стиле диалогового окна предупреждения. Просто попробовал это в одном из проектов. – sat 2010-12-15 10:28:20

+0

Просто сравнили 2 способа, 1. С AlertDialog.builder и еще 2. actvity с темой Dialog, второе - лучшее решение, только недостаток, если нужно отправить некоторые результаты обратно в фоновый вид, нужно использовать startActivityForResult, поскольку элементы (просмотров) в фоновом режиме недоступны. – sat 2010-12-16 11:11:30

24

Хорошо, я могу управлять шириной и высотой с помощью класса Builder. я использовал

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(); 
7

Это работает так же, добавив .getWindow().setLayout(width, height) после 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

Прежде чем пытаться отрегулировать размер пост-макет, сначала проверьте, какой стиль ваш диалог используется. Убедитесь, что ничто в дереве стиля не устанавливает

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

Если это происходит, это так же просто, как поставлять свой собственный стиль в [строитель конструктор, который принимает в themeResId] (http://developer.android.com/reference/android/app/AlertDialog.Builder.html#AlertDialog.Builder(android.content.Context, INT)) доступен API 11+

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

Если вы хотите добавить динамическую ширину и высоту на основе рамы устройства, вы можете выполнить эти вычисления и назначить высоту и ширину.

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: Показать диалог первой, а затем попытаться изменить расположение окна атрибутов

Смежные вопросы