0

A 创建一个简单的主题为

 <style name='one'>
    <item name='android:textColor'>#eea</item>
    <item name='android:textSize'>20sp</item>
    </style>

但是在模拟器中查看时屏幕变黑。当我不应用主题时,屏幕有白色背景。这里真正发生了什么。我只是从 android 开始。此外,如果将主题应用于我的活动,则主题的属性将应用于我的活动的所有组件,例如按钮、文本字段和编辑文本。那我为什么要写

android:textSize=?android:textSize 

当相同的值已经应用时,从我的布局中的任何按钮的主题中引用值。

上面的语法是从我的主题中引用属性以分配给我的布局中任何视图的属性的正确方法。谢谢特金德

4

1 回答 1

1

是的,所以你需要做更多的阅读。

让我们从基础开始,

您需要了解属性、样式和主题之间的区别。

属性是可以设置样式的东西。例如:android:textSize是一个可以有任何值的属性。

样式是一组将应用于 Widget的特定属性。它们在您的/values/styles.xml

例如:

<style name="normalTextThin" parent="android:Widget.Holo.Light.TextView">
    <item name="android:gravity">left|center_vertical</item>
    <item name="android:padding">8dp</item>
    <item name="android:textColor">#FFFFFF</item>
    <item name="android:textSize">16sp</item>
</style>

样式可以作为主题的一部分应用,也可以直接作为独立于主题的应用。

小部件的主题独立样式如下所示:

 <TextView
    android:id="@+id/text"
    style="@style/normalTextThin"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

然后,您只对那个 TextView进行主题化。

主题样式的集合,可以应用于 UI 的一部分,例如整个 Activity 或整个应用程序。

例如:

<style name="AppTheme" parent="android:Theme.Light">
    <item name="android:editTextStyle">@style/EditTextAppTheme</item>
    <item name="android:buttonStyle">@style/ButtonAppTheme</item>
    <item name="android:imageButtonStyle">@style/ImageButtonAppTheme</item>
</style>

在这里,我们声明应用程序中的所有EditText 都将使用名为的样式EditTextAppTheme,依此类推。像这样完成后,为了让主题真正处于活动状态,您可以在清单中声明它:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

这意味着您不需要在您创建的每个小部件上声明样式。

<EditText
    android:id="@+id/input"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/hint_search">
    <requestFocus />
</EditText>

那里的那个小部件已经使用EditTextAppTheme了样式,而无需您明确声明。

我建议您尝试阅读可以设置样式的属性,如何设置它们的样式等等。

如果您不想这样做,没关系,您仍然可以使用以下样式工具完成很多工作:

希望有帮助。

附加信息

让我整体澄清一下?attr/attributeName

?意味着系统将为attributeName当前配置选择特定的值(不特定于不同的主题)。仅当您希望不同配置上的值不同时才应使用此选项。例如:

?android:attr/actionBarSize

这条线是一个维度,它不会基于当前主题,而是基于当前设备屏幕尺寸和方向(values、values-land、values-sw600dp)而有所不同。

重要的是要知道指定?android:意味着您正在访问预设的 Android 值,而不是的。如果您拥有或想要为特定配置创建和使用自己的属性值,则必须执行以下操作:

attrs.xml在您的 /values/ 文件夹中创建一个名为的文件。

声明所需的自定义属性:

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <attr name="my_custom_attr" format="reference" />
</resources>

为自定义属性声明一个值,比如说在您自己的主题上。

<style name="AppTheme" parent="android:Theme.Light">
    <item name="my_custom_attr">@resource_type/resource_name</item>
    <item name="android:editTextStyle">@style/EditTextAppTheme</item>
    <item name="android:buttonStyle">@style/ButtonAppTheme</item>
    <item name="android:imageButtonStyle">@style/ImageButtonAppTheme</item>
</style>

然后你可以在你想要的 Widget 上使用它:

希望能解决问题。

编辑 2

为了更好地回答您的问题,请更新您的问题。就像我说的,阅读更多关于如何正确创建样式的信息。

  1. 名为“one”的主题,您想将其应用于什么?一个活动,一个小部件,整个应用程序?
  2. 你是如何应用主题的?显示您指定使用主题“one”的代码行。

您指定的主题根本不是正确构建的主题/样式。

<style name='one'>
<item name='android:textColor'>#eea</item>
<item name='android:textSize'>20sp</item>
</style>

这绝对没有任何意义,它绝对不适合 Activity 级别的主题。您指定级的原因是您的主题可以继承父级的所有属性,然后您指定要更改哪些属性。

例如,如果您想使用主题并拥有浅色背景,请执行以下操作:

<style name='one' parent="android:Theme.Holo.Light>
    <item name='android:textColor'>#eea</item>
    <item name='android:textSize'>20sp</item>
</style>

但是即使在这里,尽管它会适用,但您不希望整个应用程序具有相同的文本颜色和大小,对吗?那是胡说八道,不同的文本颜色和大小占用户体验的很大一部分,因此我们可以创建子样式并将它们应用于某些小部件,而不是从我们可以称为主要样式的设置这些值。

我真的不能再详细说明我已经拥有的东西了,上面解释了如何完成特定于 Widget 的样式和活动/应用程序级别的主题。

要获得完整的启动指南,请阅读Android 开发者网站,尝试那里声明的测试样式,看看它们是如何工作的,在此之前尝试创建自己的,如果没有阅读过,请不要尝试凭空创造一些东西制成。

于 2013-06-02T11:30:45.393 回答