普通视图上的 Android 自定义属性?

3

在查看Fede的UberMusic主题后,我发现了文件album_screen.xml。下面是该文件的源代码。基本上我注意到他的主题有使用自定义视图的能力,这些视图可以成为他应用程序的一部分,并且它们在顶部有这个XML命名空间theme。我不明白他如何能够将属性应用于他无法控制的视图,以及Eclipse如何能够成功编译以下代码。我将URL http://schemas.uberdroidstudio.com/theme 放入我的浏览器地址栏中,但没有任何结果,并且我无法弄清楚Eclipse从哪里知道命名空间支持的属性。谢谢您的帮助。

<?xml version="1.0" encoding="utf-8"?>
<merge
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:theme="http://schemas.uberdroidstudio.com/theme">
    <TextView  
        android:id="@id/artist"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_weight="0.0"
        theme:textFilter="uppercase" /> <!-- This is the interesting line -->
2个回答

0

其实解决方案并不像我最初想的那么复杂。XML命名空间只是需要保证唯一性的任意字符串。如果你的命名空间不以 http://schemas.android.com/apk/res 开头,则不会进行验证,APK包也不会检查 declare-styleable 或类似的内容。 现在,通过这个GitHub代码片段,自定义命名空间非常简单易行。最后,通过使用 LayoutInflater.Factory 和在填充视图之前调用 setFactory,可以将自定义XML属性应用于“正常”小部件。将它们整合起来,就可以创建一个强大的、基于XML的主题化应用程序,如Fede的UberMusic。


0

我怀疑theme:textFilter="uppercase"这一行并没有对(明显是香草味的)TextView产生影响。

至于命名空间的URL,有趣的是你无法访问它,因为它似乎不是本地可样式化的(Android会让你将本地可样式化的命名空间称为http://schemas.android.com/apk/res/your.package)。+1的新奇之处。


如果textFilter不改变TextView的外观,那么为什么要包括它?在我的测试中,如果我将其删除,TextView就不再是大写字母了,正如你所提到的,这里没有styleable,因此还有其他的东西在起作用。也许这是一个自定义的LayoutInflater? - Tom
@Tom,既然你已经验证了它的有效性,那么你已经证明了我的答案是错误的。我撤回它。 - cdhabecker
不一定,正如我所说,如果他使用自定义的LayoutInflater,他并没有改变TextView的行为,而只是在XML解析时调用必要的方法。但这只是一种理论,我希望有更好的替代方案。 - Tom

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