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