如何更改 Android 对话框边距(到屏幕边缘的距离)?
How to change Android Dialog side margins (distance to screen edge)?
我一直在寻找一种简单明了的方法来更改 AlertDialog
边距,但没有成功。更清楚地说,我想要的是改变对话框每一边与屏幕 side/edge 之间的距离。我希望我的对话框与出现在
Material Design specification
这是我从一个简单的 android AlertDialog
中 like/expect 得到的图像,右边是我使用下面的代码实际看到的图像。
这是我的代码。
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(message);
builder.setTitle(title);
builder.setPositiveButton(positiveId, positiveListener);
builder.show();
在您跳到以编程方式设置对话框的 LayoutParams
的明显答案之前,让我说我知道我可以做这样的事情并且逃脱它。
final AlertDialog dialog = builder.create();
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
float dialogWidth = width - TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2 * SIDE_MARGIN_IN_DPS, r.getDisplayMetrics());
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(dialog.getWindow().getAttributes());
lp.width = (int) dialogWidth;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
dialog.getWindow().setAttributes(lp);
dialog.show();
但我不敢相信没有更简单、更干净的方法,而且我们每次想打开 AlertDialog
时都应该这样做。我尝试为应用于对话框的样式设置边距,但要么它没有做任何事情,要么它改变了对话框的内部边距(内容和对话框的 side/edge 之间的边距)。我猜我看错款式了。
有没有人遇到过同样的问题?关于如何在样式中而不是在代码中设置此边距有什么想法吗?
更新:
这是我的应用程序 style/theme:
<style name="Base.Theme.App" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/primary</item>
<item name="colorPrimaryDark">@color/primary_dark</item>
<item name="colorAccent">@color/accent</item>
<item name="android:windowBackground">@color/activity_background</item>
<item name="android:textColor">@color/primary_text</item>
<item name="android:textColorSecondary">@color/secondary_text</item>
<item name="colorControlHighlight">@color/control_highlight</item>
<item name="colorControlActivated">?attr/colorAccent</item>
<!-- You can also set colorControlNormal and colorSwitchThumbNormal. -->
<!--<item name="android:colorButtonNormal">@color/primary</item>-->
<item name="android:spinnerStyle">@style/form_spinner</item>
<item name="spinnerStyle">@style/form_spinner</item>
<item name="android:spinnerItemStyle">@style/form_spinner_item</item>
<item name="editTextStyle">@style/form_edittext</item>
<item name="android:editTextStyle">@style/form_edittext</item>
<item name="alertDialogTheme">@style/Theme.App.Dialog.Alert</item>
</style>
这是我的 alertDialogTheme
<style name="Theme.App.Dialog.Alert" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="colorPrimary">@color/primary</item>
<item name="colorAccent">@color/primary</item>
<item name="android:windowBackground">@color/activity_background</item>
<item name="android:textColor">@color/primary_text</item>
<item name="android:textColorSecondary">@color/secondary_text</item>
<item name="colorControlHighlight">@color/control_highlight</item>
</style>
我的建议是(这可能是因为我通常喜欢构建自定义视图)构建您自己的对话框并使用 FEATURE_NO_TITLE WindowFeature。从那里开始,设置您自己的 xml 布局文件,您可以根据需要自定义该文件并遵守 Material 设计指南。这样您就可以按照自己的方式自定义任何内容。
像这样:
public class MaterialDialog extends Dialog {
protected MaterialDialog(Context context) {
super(context);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.dialog_material);
// From here on, you initialize your title, message and negative and(or) positive buttons.
}
}
使用以下主题:
<style name="custom_alert_dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog
</item>
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
</style>
在您的代码中:
AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.custom_alert_dialog);
我一直在寻找一种简单明了的方法来更改 AlertDialog
边距,但没有成功。更清楚地说,我想要的是改变对话框每一边与屏幕 side/edge 之间的距离。我希望我的对话框与出现在
Material Design specification
这是我从一个简单的 android AlertDialog
中 like/expect 得到的图像,右边是我使用下面的代码实际看到的图像。
这是我的代码。
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(message);
builder.setTitle(title);
builder.setPositiveButton(positiveId, positiveListener);
builder.show();
在您跳到以编程方式设置对话框的 LayoutParams
的明显答案之前,让我说我知道我可以做这样的事情并且逃脱它。
final AlertDialog dialog = builder.create();
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
float dialogWidth = width - TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2 * SIDE_MARGIN_IN_DPS, r.getDisplayMetrics());
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(dialog.getWindow().getAttributes());
lp.width = (int) dialogWidth;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
dialog.getWindow().setAttributes(lp);
dialog.show();
但我不敢相信没有更简单、更干净的方法,而且我们每次想打开 AlertDialog
时都应该这样做。我尝试为应用于对话框的样式设置边距,但要么它没有做任何事情,要么它改变了对话框的内部边距(内容和对话框的 side/edge 之间的边距)。我猜我看错款式了。
有没有人遇到过同样的问题?关于如何在样式中而不是在代码中设置此边距有什么想法吗?
更新:
这是我的应用程序 style/theme:
<style name="Base.Theme.App" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/primary</item>
<item name="colorPrimaryDark">@color/primary_dark</item>
<item name="colorAccent">@color/accent</item>
<item name="android:windowBackground">@color/activity_background</item>
<item name="android:textColor">@color/primary_text</item>
<item name="android:textColorSecondary">@color/secondary_text</item>
<item name="colorControlHighlight">@color/control_highlight</item>
<item name="colorControlActivated">?attr/colorAccent</item>
<!-- You can also set colorControlNormal and colorSwitchThumbNormal. -->
<!--<item name="android:colorButtonNormal">@color/primary</item>-->
<item name="android:spinnerStyle">@style/form_spinner</item>
<item name="spinnerStyle">@style/form_spinner</item>
<item name="android:spinnerItemStyle">@style/form_spinner_item</item>
<item name="editTextStyle">@style/form_edittext</item>
<item name="android:editTextStyle">@style/form_edittext</item>
<item name="alertDialogTheme">@style/Theme.App.Dialog.Alert</item>
</style>
这是我的 alertDialogTheme
<style name="Theme.App.Dialog.Alert" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="colorPrimary">@color/primary</item>
<item name="colorAccent">@color/primary</item>
<item name="android:windowBackground">@color/activity_background</item>
<item name="android:textColor">@color/primary_text</item>
<item name="android:textColorSecondary">@color/secondary_text</item>
<item name="colorControlHighlight">@color/control_highlight</item>
</style>
我的建议是(这可能是因为我通常喜欢构建自定义视图)构建您自己的对话框并使用 FEATURE_NO_TITLE WindowFeature。从那里开始,设置您自己的 xml 布局文件,您可以根据需要自定义该文件并遵守 Material 设计指南。这样您就可以按照自己的方式自定义任何内容。
像这样:
public class MaterialDialog extends Dialog {
protected MaterialDialog(Context context) {
super(context);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.dialog_material);
// From here on, you initialize your title, message and negative and(or) positive buttons.
}
}
使用以下主题:
<style name="custom_alert_dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog
</item>
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
</style>
在您的代码中:
AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.custom_alert_dialog);