获取AlertDialog的默认填充

Sna*_*gon 42 android android-alertdialog

我需要AlertDialog使用自定义视图.a的消息AlertDialog有一个默认的填充但是当我设置一个视图它没有填充时,我想要获得与默认消息相同的填充.我正在使用扩展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();
Run Code Online (Sandbox Code Playgroud)

这是内容的布局:

<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>
Run Code Online (Sandbox Code Playgroud)

tro*_*per 73

?dialogPreferredPadding属性现在具有此值.它是在API 22中引入的; 请参阅https://developer.android.com/sdk/api_diff/22/changes/android.R.attr.html.

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

  • 这非常有效,我想指出,如果使用`?dialogPreferredPadding`而不是`?android:dialogPreferredPadding`,该属性将出现在支持库中. (18认同)
  • 如何以编程方式应用它?在我的情况下,我只使用 AlertDialog.setAdapter(ListAdapter),没有任何视图。 (2认同)

Osm*_*sha 21

我遇到了同样的问题,所以不得不找到答案.如果有人来寻找答案,这是我的解决方案.

AlertDialog的布局的源代码在alert_dialog.xml中描述(例如这里的android 4.4.1,它应该对应于Holo主题).布局有硬编码填充(在不同版本的android中它们可能有所不同).要知道默认填充,您必须总结包含id/message"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();
Run Code Online (Sandbox Code Playgroud)

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

[]

  • 我在自定义视图布局中的paddingLeft paddingRight中使用了"?dialogPreferredPadding". (3认同)

and*_*per 9

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

您可以在布局 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
}
Run Code Online (Sandbox Code Playgroud)

用法:

val alertDialogPadding = getDimensionFromAttribute(context, R.attr.dialogPreferredPadding)
view.setPadding(alertDialogPadding, 0, alertDialogPadding, 0)
Run Code Online (Sandbox Code Playgroud)

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