Подтвердить что ты не робот

Получение заполнения по умолчанию для AlertDialog

Мне нужно сделать AlertDialog с пользовательским представлением. Сообщение AlertDialog имеет заполнение по умолчанию, но когда я устанавливаю представление, у него нет отступов, я wand получает то же самое дополнение, что и значение по умолчанию в качестве сообщения. Я использую стиль, который расширяет тему 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>
4b9b3361

Ответ 1

Атрибут ?dialogPreferredPadding теперь имеет это значение. Он был введен в API 22; см. https://developer.android.com/sdk/api_diff/22/changes/android.R.attr.html.

Вы можете получить согласованное дополнение в своих пользовательских диалогах, указав этот атрибут в макете диалога. Например, android:paddingLeft="?dialogPreferredPadding" приведет содержимое диалога в соответствие с его названием.

Ответ 2

Я застрял с той же проблемой, поэтому мне пришлось найти ответ. Если кто-то найдет ответ, вот мое решение.

Исходный код для макета AlertDialog описан в alert_dialog.xml(например, здесь для android 4.4.1, который должен соответствовать теме Holo). Макет имеет жестко закодированные прокладки (и они могут отличаться в разных версиях андроида). Чтобы узнать значение по умолчанию, вы должны суммировать все paddings для представлений, содержащих id/message" TextView. В этом случае они равны 3 + 14 + 5 = 22 dp влево и 1 + 10 + 5 = 16 dp вправо.

Элемент android:id/custom - это место, в которое вставлено пользовательское представление, и у него есть 3 dp left и 1 dp right paddings (от корневого элемента, другие не имеют paddings), которые вам не нужно устанавливать вручную.

Итак, чтобы получить добавление настраиваемого представления, это то же самое, что и сообщение, установите его на 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();

Этот код дает результат, подобный этому (выглядит хорошо). Кстати, это материальная тема, которая, похоже, имеет одинаковые paddings (также жестко запрограммированные).

[]

Ответ 3

Просто чтобы добавить более полный ответ о том, как его использовать:

Вы можете использовать в макете 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 (и, возможно, некоторые другие представления), я не думаю, что можно установить отступы или поля так, чтобы он хорошо выровнялся с другими представлениями в диалоговом окне, если вы не заключите его в другое представление, или продлить его