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