android-获取AlertDialog的默认填充

我需要使用自定义视图制作AlertDialogAlertDialog的消息具有默认填充,但是当我设置一个视图时,它没有填充,因此我希望获得与消息相同的默认填充。 我使用的是扩展Holo主题的样式(如果相关)。

AlertDialog.Builder builder = new AlertDialog.Builder(PlaylistListView.this.getContext());
builder.setTitle("Title");
builder.setView(inflate(context, R.layout.music_player_create_dialog, null));
builder.setPositiveButton("OK", null);
builder.setNegativeButton("Cancel", null);
builder.show();

这是内容的布局:

<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="@dimen/abc_dialog_padding_material"
    android:paddingRight="@dimen/abc_dialog_padding_material"
    android:paddingTop="@dimen/abc_dialog_padding_top_material"
    android:paddingBottom="@dimen/abc_dialog_padding_top_material">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Title:"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="bottom"
        android:background="@null"
        android:layout_marginTop="20dp"/>
    <View
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:background="@color/divider"/>
</LinearLayout>
SnapDragon asked 2020-08-11T19:47:08Z
3个解决方案
71 votes

android:paddingLeft="?dialogPreferredPadding"属性现在具有此值。 它是在API 22中引入的; 参见[https://developer.android.com/sdk/api_diff/22/changes/android.R.attr.html。]

通过在对话框的布局上指定此属性,可以在自定义对话框中获得一致的填充。 例如,android:paddingLeft="?dialogPreferredPadding"将使对话框的内容与其标题对齐。

trooper answered 2020-08-11T19:47:19Z
21 votes

我陷入了同样的问题,所以不得不找到答案。 万一有人来寻找答案,这是我的解决方案。

AlertDialog的布局的源代码在alert_dialog.xml中进行了说明(例如,此处为android 4.4.1,应与Holo主题相对应)。 布局具有硬编码的填充(在不同版本的android中它们可能有所不同)。 要知道默认的填充,您必须对包含android:id/custom TextView的视图的所有填充进行汇总。 在这种情况下,它们分别为3 + 14 + 5 = 22 dp和1 + 10 + 5 = 16 dp。

android:id/custom元素是在其中插入自定义视图的元素,它具有3 dp左和1 dp右填充(从根元素开始,其他填充没有填充),您无需手动设置。

因此,要使自定义视图的结果填充与消息的填充相同,请将其设置为左19 dp和右15 dp(并且不要忘记保留默认的5 dp顶部和底部填充)。

示例代码:

final EditText input = new EditText( getContext() );
float dpi = ctx.getResources().getDisplayMetrics().density;
AlertDialog dialog = (new AlertDialog.Builder(getContext()))
        .setTitle("Rename track")
        .setMessage("Track name:")
        .setPositiveButton("OK", null)
        .setNegativeButton("Cancel", null)
        .create();
dialog.setView(input, (int)(19*dpi), (int)(5*dpi), (int)(14*dpi), (int)(5*dpi) );
dialog.show();

这些代码给出了这样的结果(看起来不错)。 顺便说一句,这是Material主题,似乎具有相同的填充(也经过硬编码)。

[]

Osman-pasha answered 2020-08-11T19:48:11Z
2 votes

只是添加关于如何使用它的更完整的答案:

您可以在布局XML文件中使用android:paddingStart="?dialogPreferredPadding"android:paddingEnd="?dialogPreferredPadding"

另外,如果您想通过代码来做:

@JvmStatic
fun getDimensionFromAttribute(context: Context, attr: Int): Int {
    val typedValue = TypedValue()
    return if (context.theme.resolveAttribute(attr, typedValue, true)) TypedValue.complexToDimensionPixelSize(typedValue.data, context.resources.displayMetrics) else 0
}

用法:

val alertDialogPadding = getDimensionFromAttribute(context, R.attr.dialogPreferredPadding)
view.setPadding(alertDialogPadding, 0, alertDialogPadding, 0)

如果您使用CheckBox(可能还有其他一些视图),我认为不可能设置填充或边距,以使其与对话框中的其他视图很好地对齐,除非您用其他视图包装它,或者 扩展它

android developer answered 2020-08-11T19:48:49Z
translate from https://stackoverflow.com:/questions/33074313/getting-default-padding-for-alertdialog