使用setView()时的AlertDialog样式

时间:2015-03-25 12:14:40

标签: android

Default AlertDialog看起来不错,使用setMessage()可以设置文本 - 很容易。

但是当使用setView()时,对话框会替换给定视图的内容,这很好。

但是,我想保留默认的填充/背景/样式。我搜索了一个合适的样式,我看了一下alert_dialog.xml,但没有找到任何有用的东西。 enter image description here

如何在不模仿的情况下应用默认样式?

4 个答案:

答案 0 :(得分:0)

使用:

AlertDialog.Builder b = new AlertDialog.Builder(this);

AlertDialog alert = b.create();
alert.setView(view, 0, 0, 0, 0);

答案 1 :(得分:0)

要修复边距,您可以使用在FrameLayout中包裹Layout,并在Layout中添加边距,如下所示:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="@dimen/dialog_margin_title"
        android:layout_marginBottom="@dimen/dialog_margin"
        android:layout_marginLeft="@dimen/dialog_margin"
        android:layout_marginStart="@dimen/dialog_margin"
        android:layout_marginRight="@dimen/dialog_margin"
        android:layout_marginEnd="@dimen/dialog_margin"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Please enter the email address of the person you would like to follow, this person will be notified." />

        <EditText
            android:id="@+id/editText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="textEmailAddress" />
    </LinearLayout>
</FrameLayout>

答案 2 :(得分:0)

您可以在创建构建器时设置AlertDialog样式。

示例:

    AlertDialog.Builder builder;
    if (title != null) {
        builder = new AlertDialog.Builder(getActivity(), R.style.AlertDialogStyle);
        builder.setTitle(title);
    }
    else {
        builder = new AlertDialog.Builder(getActivity(), R.style.AlertDialogStyleNoTitle);
    }

在styles.xml文件中:

<style name="AlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primary_dark</item>
    <item name="colorAccent">@color/accent</item>
    <item name="android:textColorPrimary">@color/black</item>
</style>

<style name="AlertDialogStyleNoTitle" parent="AlertDialogStyle">
    <item name="android:windowNoTitle">true</item>
</style>

我的风格只是你可以做的一些事情的例子 - 如果你愿意,你可以只有一个对话框风格。只要你从一个Dialog.Alert样式继承,你应该很高兴。

您仍然需要自己设置填充。我查看了材料设计指南,边距是24dp。

答案 3 :(得分:0)

基于AppCompat的源代码

https://chromium.googlesource.com/android_tools/+/HEAD/sdk/extras/android/support/v7/appcompat/res/layout/abc_alert_dialog_material.xml

这是一个看起来不错的Dialog自定义视图的布局示例

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:paddingBottom="@dimen/abc_dialog_padding_top_material"
    android:paddingLeft="?attr/dialogPreferredPadding"
    android:paddingRight="?attr/dialogPreferredPadding"
    android:paddingTop="@dimen/abc_dialog_padding_top_material">

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:layout_weight="1" />

    <Spinner
        android:id="@+id/spinner2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />
</LinearLayout>

请注意,使用私有值并非raccomanded,例如abc_dialog_padding_top_material,但我找不到更好的解决方案。