Вопрос: По умолчанию прокладки для пользовательского макета в диалоговом окне «Материал»


Я использую appcompat-v7 AlertDialog и Google Material Design lib:

compile 'com.android.support:appcompat-v7:22.2.1'
compile 'com.android.support:design:22.2.1'

Я создал DialogFragment который создает мой диалог, используя пользовательский макет:

// import android.support.v7.app.AlertDialog;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity());

    final ViewGroup v = (ViewGroup) LayoutInflater.from(dialogBuilder.getContext()).inflate(R.layout.d_password, null);

    final AlertDialog dialog = dialogBuilder.setTitle("Pass")
        .setView(v)
        .setPositiveButton(android.R.string.ok, null)
        .setNegativeButton(android.R.string.cancel, null)
        .create();

    return dialog;
}

мой d_password.xml макет выглядит следующим образом:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:id="@+id/et_pass"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Pass"
            android:inputType="textPassword" />
    </android.support.design.widget.TextInputLayout>
</LinearLayout>

Проблема в том, что маркер отсутствует, он почти соприкасается с заголовком и правом / левым полем диалога.

Чтобы он выглядел так же, как стандартный диалог материалов (с текстом вместо пользовательского макета), мне пришлось изменить макет:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingLeft="@dimen/abc_dialog_padding_material"
    android:paddingRight="@dimen/abc_dialog_padding_material"
    android:paddingTop="@dimen/abc_dialog_padding_top_material">
...

Вопрос заключается в следующем: как я могу создать свой собственный макет по умолчанию, если он не задан в макете по умолчанию?


4


источник


Ответы:


Вы можете разместить общие элементы в стиле и применить этот стиль к вашим представлениям. Увидеть документы стилей и тем

Вы уже определили, какие свойства необходимы для ваших просмотров. Это свойства, которые вы хотите разместить в своей настраиваемой теме.

В styles.xml

<style name="YourTheme.MaterialMargins" parent="ParentTheme">
        <item name="android:paddingLeft">@dimen/abc_dialog_padding_material</item>
        <item name="android:paddingRight">@dimen/abc_dialog_padding_material</item>
        <item name="android:paddingTop">@dimen/abc_dialog_padding_top_material</item>
</style>

Вы можете, конечно, изменить название YourTheme а также MaterialMargins,

Затем в вашем XML-файле макета вы можете добавить этот стиль для каждого вида, к которому вы хотите применить его.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    style="@style/YourTheme.MaterialMargins">

Если вы хотите, вы можете также включить layout_width а также layout_height если это то же самое по вашим представлениям.


1