通过样式更改Android对话框按钮文本大小

14

我试图通过样式来增大所有应用程序对话框按钮的文本大小。以下代码将更改按钮的背景颜色并且可以更改文本大小写,但由于某种原因,文本大小项未被使用:

<style name="MyAppTheme" parent="@android:style/Theme.Holo">
    <item name="android:dialogTheme">@style/MyApp.Dialog</item>
    <item name="android:alertDialogTheme">@style/MyApp.Dialog.Alert</item>
</style>

<style name="MyApp.Dialog" parent="@android:style/Theme.Holo.Dialog">
    <item name="android:borderlessButtonStyle">@style/MyApp.BorderlessButton</item>
</style>

<style name="MyApp.Dialog.Alert" parent="@style/MyApp.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

<style name="MyApp.BorderlessButton" parent="@android:style/Widget.Holo.Button.Borderless">
    <item name="android:textSize">50sp</item>
    <item name="android:textAllCaps">true</item>
    <item name="android:background">#800</item>
</style>

具有背景颜色和文本AllCaps但没有文本大小的对话框按钮

为什么文本大小没有被识别?我需要做什么来使它变大?


你尝试过使用“dp”而不是“sp”了吗? - Apoorv
刚试了一下,没有任何区别,而且编译器会警告你应该使用sp来设置字体大小。 - Luke Sleeman
也许由于某些原因,您想要的尺寸太大了?如果您使用30sp或其他尺寸会发生什么,请看看。 - gilonm
请参考以下问题:https://dev59.com/UGUo5IYBdhLWcg3wmQdN - Praveena
你添加了另外两种样式,但按钮的那个样式没有被使用,你确定你将样式更改为自定义的吗? - Ayoub
显示剩余6条评论
4个回答

7
您在这里没有正确分配属性:
<style name="MyApp.Dialog" parent="@android:style/Theme.Holo.Dialog">
====>    <item name="android:borderlessButtonStyle">@style/MyApp.BorderlessButton</item>
</style>

您需要使用的属性是:


android:buttonStyle

我建议做出以下更改:

<style name="MyApp.Dialog" parent="@android:style/Theme.Holo.Dialog">
    <item name="android:buttonStyle">@style/MyApp.BorderlessButton</item>
</style>

为什么: borderlessButtonStyle是一个方便定义的样式。但目前它没有与任何默认属性连接 - 在这种情况下,buttonStyle。你仍然需要分配它。
我无法理解为什么backgroundtextAllCaps属性会生效。发布对话框/警报对话框的xml可能会有所帮助。还有,你是如何定义字符串的 - "i agree" 还是 "I AGREE"?

我尝试了您提出的更改。奇怪的是,按钮失去了其背景颜色,但textAllCaps仍然有效。按钮字体没有变大。我没有特定的Java代码或XML对话框 - 我希望我的应用程序中的所有对话框都以这种方式显示。有些是通过代码生成的,但其他一些是在首选项API内自动生成的。 - Luke Sleeman
@LukeSleeman 非常抱歉。建议的更改将适用于自定义内容-当您将自定义布局设置为对话框时。如果您使用系统提供的布局,则文本大小在xml中是固定的。有几种方法可以解决这个问题-在创建对话框之后(在显示之前)更新文本大小-您可以通过在对话框中查找findViewById(android.R.id.button1)并设置文本大小来实现此目的。另一种方法是扩展Dialog类并定义自己的默认布局,该布局依赖于主题提供文本大小。但这两种方法都无法满足您的要求。 - Vikram

1

在Holo中,AlertDialog中的按钮使用android:buttonBarButtonStyle。在您的主题/样式中覆盖该属性,并将android:minHeight="0dp"设置为自动包裹内容,或者您可以提供自己的高度。

更正:我误读了标题。当然,您可以在同一样式上设置android:textSize="32sp"以更改文本大小。

这是来自框架的布局:

<LinearLayout android:id="@+id/buttonPanel"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="@dimen/alert_dialog_button_bar_height"
    android:orientation="vertical"
    android:divider="?android:attr/dividerHorizontal"
    android:showDividers="beginning"
    android:dividerPadding="0dip">
    <LinearLayout
        style="?android:attr/buttonBarStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layoutDirection="locale"
        android:measureWithLargestChild="true">
        <Button android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_gravity="start"
            android:layout_weight="1"
            android:maxLines="2"
            style="?android:attr/buttonBarButtonStyle"
            android:textSize="14sp"
            android:minHeight="@dimen/alert_dialog_button_bar_height"
            android:layout_height="wrap_content" />
        <Button android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_weight="1"
            android:maxLines="2"
            style="?android:attr/buttonBarButtonStyle"
            android:textSize="14sp"
            android:minHeight="@dimen/alert_dialog_button_bar_height"
            android:layout_height="wrap_content" />
        <Button android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_gravity="end"
            android:layout_weight="1"
            android:maxLines="2"
            android:minHeight="@dimen/alert_dialog_button_bar_height"
            style="?android:attr/buttonBarButtonStyle"
            android:textSize="14sp"
            android:layout_height="wrap_content" />
    </LinearLayout>
 </LinearLayout>

1
我刚刚尝试了覆盖android:buttonBarButtonStyle,我可以改变背景颜色和textAllCaps,但是字体大小没有改变。根据您上面发布的框架布局,从样式中更改textSize似乎是不可能的,因为textSize属性在布局中设置,这将覆盖来自style="?android:attr/buttonBarButtonStyle"的任何内容。 - Luke Sleeman
你可以尝试在buttonBarButtonStyle样式中设置android:textAppearance属性。我记不清哪个优先级更高了。还有其他几种方法可以将这些更改应用于整个应用程序。我会看看是否有时间建议一些方法。 - Simon

0

我知道这不是解决你问题的答案,但为什么你不想将Activity样式设置成Dialog呢?我曾经和你一样遇到过同样的问题,而且在Android中设置Dialog的样式真的很痛苦。使用Activity,你可以将任何你想要的xml内容放进去,并按照自己的喜好进行样式设置。此外,你还可以使用ActionBarDialog中添加菜单并使用自定义视图。也许现在是时候将你的Android对话框更改为带有Dialog样式的Activity了。


正如我先前提到的,我正在使用各种对话框来完成我的应用程序,包括由首选项 API 生成的对话框。 - Luke Sleeman

-2
尝试这种风格:
<style name="MyApp.BorderlessButton" parent="@android:style/Widget.Holo.Button.Borderless">
   <item name="android:textSize">50sp</item>
   <item name="android:textAllCaps">true</item>
   <item name="android:background">#800</item>
</style>

不行,那只会导致编译错误。你试过了吗,看看它是否可行? - Luke Sleeman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接