【问题标题】:Getting default padding for AlertDialog获取 AlertDialog 的默认填充
【发布时间】:2016-01-09 12:43:24
【问题描述】:

我需要使用自定义视图创建 AlertDialog。 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();

这是内容的布局:

<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 请添加你所做的代码

标签: android android-alertdialog


【解决方案1】:

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

您可以在布局 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(可能还有其他一些视图),我认为不可能设置填充或边距,以便它与对话框中的其他视图很好地对齐,除非您使用不同的包装查看或扩展它

【讨论】:

  • Java 版本: private static int getDimensionFromAttribute(Context context, int attrId) { final TypedValue value = new TypedValue(); if (context.getTheme().resolveAttribute(attrId, value, true)) { return TypedValue.complexToDimensionPixelSize(value.data, context.getResources().getDisplayMetrics()); } 返回 0; }
  • @Oliver 不需要。 Kotlin 支持 Java,Java 支持 Kotlin。无论如何,这两种语言都非常相似。
  • 也许对于有经验的开发者来说并不是真正需要的,也许新手会喜欢:)。无论如何,我不想在同一个项目中混合使用 Kotlin 和 Java。
  • @Oliver 有时您别无选择。如果你在一个旧项目上工作,它主要是 Java。并且很难在没有任何问题的情况下将其全部转换为 Kotlin。我必须处理一个包含大约 1000 个 Java 文件的项目,到目前为止,我只将其中的大约 200 个转换为 Kotlin。 Android 开发人员应该知道这两种语言。两者都在各个地方使用,包括在 Google 的演示文稿和文档中。而 Kotlin 现在是主要和默认的,所以它更加重要。
  • 你是对的......但这取决于项目。如果我的项目已经在 J​​ava 中,我希望所有代码都使用相同的语言,所以我不会在项目中使用 Kotlin,除非完全有必要:)
【解决方案2】:

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

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

【讨论】:

  • 这很好用,我想指出,如果您使用 ?dialogPreferredPadding 而不是 ?android:dialogPreferredPadding,该属性存在于支持库中。
  • 这个设置是什么值?我想 24dp 因为它目前是默认值,但我想知道这是否根据材料规格在顶部设置 20dp material.io/guidelines/components/dialogs.html#dialogs-specs
  • 如何以编程方式应用它?就我而言,我只使用 AlertDialog.setAdapter(ListAdapter),没有任何视图。
  • 我想我们永远不会知道
【解决方案3】:

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

AlertDialog 布局的源代码在 alert_dialog.xml 中描述(例如here for 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();

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

[]

【讨论】:

  • 巧合的是,您仅在 23 小时前才回答,而我也处于同样的困惑中。显然,默认布局设计得不好,但你的回答很有效,让它看起来更好,谢谢。
  • @MatthewMitchell 欢迎您!是的,AlertDialog 布局可能应该有一些 @android:dimen/dialog_padding 常量而不是硬编码的数字,或者强制填充到插入的视图(我认为第一个选项更好)
  • 编译器说@android:dimen/dialog_padding is not public.
  • @Sin-jeong-hun 它并没有在 AlertDialog 布局中使用,因此它可能包含与 AlertDialog 中的填充不同的值
  • 我在自定义视图布局中的 paddingLeft paddingRight 中使用了“?dialogPreferredPadding”。
猜你喜欢
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 2012-07-22
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多