Android:在保留默认主题的同时定制AlertDialog的智能方式

Android:在保留默认主题的同时定制AlertDialog的智能方式,android,Android,我想显示一个AlertDialog,其中包含两行文本作为其消息。第二行文本的字体应该比第一行小,并加下划线,我希望在单击时收到通知。此外,我希望AlertDialog与调用AlertDialog.Builder.setMessage构建的对话框类似 自定义布局可以使用以下代码完成,但结果与使用AlertDialog.Builder.setMessage创建的对话框非常不同。附加的两个图像分别是通过此代码和调用AlertDialog.Builder.setMessage创建的对话框 关于如何在保留

我想显示一个AlertDialog,其中包含两行文本作为其消息。第二行文本的字体应该比第一行小,并加下划线,我希望在单击时收到通知。此外,我希望AlertDialog与调用AlertDialog.Builder.setMessage构建的对话框类似

自定义布局可以使用以下代码完成,但结果与使用AlertDialog.Builder.setMessage创建的对话框非常不同。附加的两个图像分别是通过此代码和调用AlertDialog.Builder.setMessage创建的对话框

关于如何在保留AlertDialog的默认主题的同时使用自定义布局,有什么建议吗

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

    LinearLayout layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);

    TextView tv1 = new TextView(this);
    tv1.setText("first line");

    TextView tv2 = new TextView(this);
    tv2.setText("second line");
    tv2.setTextSize(TypedValue.COMPLEX_UNIT_PX, tv1.getTextSize() * .8f);
    tv2.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
    tv2.setOnClickListener(this);

    layout.addView(tv1);
    layout.addView(tv2);
    builder.setView(layout);

    builder.show();

编辑

好的,我无法用下面的代码生成合理的结果。问题是,第二行的文本大小硬编码为12个凹陷,但我希望它实际上按比例小于第一行的文本大小-可能是第一行文本大小的80%。对如何实现这一点有什么建议吗

(另外,确定文本的下划线部分何时被单击会有点难看,但我想我可以弄清楚)


在清单中将活动定义为主题对话框,然后您可以将该活动设计为您想要的样子,并将其显示为对话框(下面的活动显示为灰色,如您所需)



请注意,我在这里添加的唯一一项清单中没有的内容是“活动”节点中的“主题”属性。

不过我确实希望使用AlertDialog(如果可能),因为我还将添加正面/负面按钮,并希望AlertDialog提供的按钮栏默认装饰。您可以将任何按钮添加到自己的活动中!我不确定您想要做的(修改股票对话框的某些方面)是否可行。我认为不是。如果您通过调用AlertDialog.Builder.setPositiveButton等添加按钮,AlertDialog将为按钮提供默认外观。外观因操作系统版本而异,因此在自定义活动中很难重新创建。类似地,AletDialogs中文本的默认外观根据设备构建而变化。这就是为什么我想尝试使用自定义的AlertDialog,如果可能的话。但是同样的道理,如果您开始自定义对话框中显示的元素(例如文本字段),那么无论设置为默认主题,您都很可能会被吹出。如果您构建自己的活动并只使用按钮(不在文本或背景上设置任何颜色),那么实际上,它将使用设备上默认的主题。在上面的代码中,我使用了Theme.Halo,但这是任意的,您可以将它设置为Dialog,然后它将返回到设备喜欢的任何位置。您看到我使用spannables进行的编辑了吗?这似乎是一个在不取消默认值的情况下使用cusotmze的好方法。问题是AlertDialog有一个默认的布局,以及默认的主题属性;这不仅仅是使按钮与默认按钮的样式相同的问题,还包括以相同的方式布置按钮。
    String text1 = "First line\n\n";
    String text2 = "Second line";

    SpannableString content = new SpannableString(text1 + text2);
    content.setSpan(new UnderlineSpan(), text1.length(), text1.length() + text2.length(), 0);
    content.setSpan(new AbsoluteSizeSpan(12, true), text1.length(), text1.length() + text2.length(), 0);

    AlertDialog.Builder builder= new AlertDialog.Builder(this);
    builder.setMessage(content);
    builder.show();
<activity
            android:name=".MyDialog"
            android:label="@string/app_name"                 
            android:theme="@android:style/Theme.Holo.Dialog"
            >
            <intent-filter>
                <action android:name="com.my.package.DIALOG" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>