Как контролировать ширину и высоту диалогового окна Alert Dial по умолчанию в Android?
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();
Я использую приведенный выше код для отображения диалогового окна Alert. По умолчанию он заполняет экран шириной и wrap_content по высоте.
Как я могу контролировать ширину и высоту диалогового окна предупреждения по умолчанию?
Я пробовал:
alert.getWindow().setLayout(100,100); // It didn't work.
Как получить параметры макета в окне предупреждения и вручную установить ширину и высоту?
Ответы
Ответ 1
Только небольшое изменение в Sat Code, установите макет после метода show()
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);
Ответ 2
Хорошо, я могу управлять шириной и высотой с помощью класса 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();
Ответ 3
Прежде чем пытаться настроить размер пост-макета, сначала проверьте, какой стиль использует ваш диалог. Убедитесь, что ничего в дереве стилей не установлено
<item name="windowMinWidthMajor">...</item>
<item name="windowMinWidthMinor">...</item>
Если это происходит, это так же просто, как предоставление собственного стиля конструктору конструктора, который принимает темуResId] (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>
Ответ 4
Это также работает, добавляя .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);
Ответ 5
Если вы хотите добавить динамическую ширину и высоту на основе рамки вашего устройства, вы можете выполнить эти вычисления и назначить высоту и ширину.
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));
PS: сначала показать диалог, а затем попытаться изменить атрибуты макета окна
Ответ 6
Я не знаю, можете ли вы изменить высоту/ширину по умолчанию AlertDialog, но если вы хотите сделать это, я думаю, вы можете сделать это, создав свой собственный диалог. Вам просто нужно предоставить android:theme="@android:style/Theme.Dialog"
в android manifest.xml для вашей деятельности и написать весь макет согласно вашему требованию. вы можете установить высоту и ширину своего настраиваемого диалога из XML файла Android.
Ответ 7
Для тех, кто найдет эту тему, как я, вот лучшее решение IMO (обратите внимание на 70%, которые устанавливают минимальную ширину диалога в процентах от ширины экрана):
<style name="my_dialog" parent="Theme.AppCompat.Dialog.Alert">
<item name="windowMinWidthMajor">70%</item>
<item name="windowMinWidthMinor">70%</item>
</style>
И затем примените этот стиль к диалогу:
AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.my_dialog);
Ответ 8
Ценит ответ Сид, потому что он динамический, но я хочу кое-что добавить.
Что, если вы хотите изменить только ширину, высота будет такой, какая она есть.
Я сделал так:
// All process of AlertDialog
AlertDialog alert = builder.create();
alert.show();
// Creating Dynamic
Rect displayRectangle = new Rect();
Window window = getActivity().getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle);
alert.getWindow().setLayout((int) (displayRectangle.width() *
0.8f), alert.getWindow().getAttributes().height);
Здесь я использовал alert.getWindow().getAttributes().height
чтобы сохранить высоту, так как она имеет значение AlertDialog
а Width
будет изменяться в соответствии с разрешением экрана.
Надеюсь, это поможет. Благодарю.
Ответ 9
Я думаю, что ответ tir38 - самое чистое решение. Имейте в виду, что если вы используете android.app.AlerDialog и голографические темы, ваш стиль должен выглядеть следующим образом
<style name="WrapEverythingDialog" parent=[holo theme ex. android:Theme.Holo.Dialog]>
<item name="windowMinWidthMajor">0dp</item>
<item name="windowMinWidthMinor">0dp</item>
</style>
И если вы используете support.v7.app.AlertDialog или androidx.appcompat.app.AlertDialog с темой AppCompat, ваш стиль должен выглядеть следующим образом
<style name="WrapEverythingDialog" parent=[Appcompat theme ex. Theme.AppCompat.Light.Dialog.Alert]>
<item name="android:windowMinWidthMajor">0dp</item>
<item name="android:windowMinWidthMinor">0dp</item>
</style>
Ответ 10
longButton.setOnClickListener {
show(
"1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n" +
"1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n" +
"1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n" +
"1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n" +
"1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n" +
"1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n" +
"1234567890-12345678901234567890123456789012345678901234567890"
)
}
shortButton.setOnClickListener {
show(
"1234567890\n" +
"1234567890-12345678901234567890123456789012345678901234567890"
)
}
private fun show(msg: String) {
val builder = AlertDialog.Builder(this).apply {
setPositiveButton(android.R.string.ok, null)
setNegativeButton(android.R.string.cancel, null)
}
val dialog = builder.create().apply {
setMessage(msg)
}
dialog.show()
dialog.window?.decorView?.addOnLayoutChangeListener { v, _, _, _, _, _, _, _, _ ->
val displayRectangle = Rect()
val window = dialog.window
v.getWindowVisibleDisplayFrame(displayRectangle)
val maxHeight = displayRectangle.height() * 0.6f // 60%
if (v.height > maxHeight) {
window?.setLayout(window.attributes.width, maxHeight.toInt())
}
}
}