何时使用"?android"或"@android"?

11

我是一个新手,正在尝试理解以下XML代码:

查看developer.android.com的文档,它说"starStyle"是R.attr中的常量


public static final int starStyle Since: API Level 1

默认星形样式。

必须引用另一个资源,格式为"@ [ + ] [package:]type:name",或者引用主题属性,格式为"?[package:][type:]name"。

似乎它表明有两种语法可以声明。 1)"@ [ + ] [package:]type:name" 2)"?[package:][type:]name"。

如果有两种语法,"@ [ + ] [package:]type:name" 的正确方式是什么?

我尝试了 "@android:attr/starStyle",但是即使应用程序编译成功,我也没有得到“星形”复选框。

6个回答

8

@-syntax用于定义在您的项目或Android框架中的资源。?-syntax用于当前主题中的资源。

对于应该在主题中定义的starStyle,您希望使用:

"?android:attr/starStyle"

有关主题资源的详细说明,请参见此处


3

Android提供了一种快捷方式,使您能够使用当前应用主题的样式。

要使用该功能,请在资源名称前使用 ?android: 作为前缀,而非 @。

例如:

<EditText
android:id="@+id/myEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@android:string/url"
android:textColor="?android:textColor"
/>

这种技术使您能够创建样式,如果当前主题更改而无需修改每个单独的样式资源,就可以更改它们。


2

AFAIK...

根据我的了解...

"?[package:][type:]name" 指的是 Android 风格,例如进度对话框样式属性如下所示:

style="?android:attr/progressBarStyleLarge"

解释如下

  • ? = ?
  • [package:] = android:
  • [type:] = attr (属性)
  • name = progressBarStyleLarge (或者在你的情况下:starStyle)

然而,样式也可以使用 @... 引用

"@[+][package:]type:name" 是某种资源。

因此,对于样式,您需要在名为 'styles.xml' 的文件中声明所有样式,在您的 'values' 目录中。

<style name="mono_text_headers">
    <item name="android:textSize">16sp</item>
    <item name="android:typeface">monospace</item>
    <item name="android:layout_marginBottom">5dp</item>
</style>

然后就像引用字符串、可绘制等一样引用它们。

style="@style/mono_text_headers"

http://developer.android.com/guide/topics/ui/themes.html


1

我对这个问题进行了很多检查,因为它曾经让我非常困惑。

问号后面的名称是您正在引用在<declare-styleable>中定义的变量名称。

“@”后面的名称是由您或系统定义的样式名称。

让我通过C++来做一个类比。

假设我们有string str1 =“Hello world”

问号就像字符串str2 = str1。它表示您正在引用str1的值。

“@”就像string str2 =“Hello world”。它表示您直接使用该值。


1

我不确定短而简单。

?表示资源定义是框架(Framework)的一部分

@表示资源定义是您的项目/支持库(Project/Support Library)的一部分


0

“@” 用于访问已定义的资源

"@android:drawables/test.png"

? 用于访问已定义的主题样式

"?android/attr/style"

希望这能帮到你。

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