【问题标题】:Android custom attributes on "normal" views?“普通”视图上的Android自定义属性?
【发布时间】:2011-10-12 06:58:26
【问题描述】:

查看 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 -->

【问题讨论】:

    标签: android xml namespaces themes


    【解决方案1】:

    我怀疑theme:textFilter="uppercase" 行实际上并没有对(显然是普通的)TextView 产生影响。

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

    【讨论】:

    • 如果 textFilter 不改变 TextView 的外观,那么他为什么要包含它?在我的测试中,如果我删除它,TextViews 不再是大写的,正如你提到的,没有样式,所以这里还有其他东西在起作用。也许它是一个自定义的 LayoutInflater?
    • @Tom 既然您已经验证它有效果,那么您已经证明我的回答是错误的。我撤回它。
    • 不一定,正如我所说,如果他使用自定义 LayoutInflater,他不会改变 TextView 的行为,而只是调用解析 XML 时出现的必要方法。但这只是一个理论,我希望有更好的选择。
    【解决方案2】:

    解决方案实际上并没有我最初想的那么复杂。 XML 命名空间是任意字符串,只需要唯一。如果您的命名空间不以http://schemas.android.com/apk/res 开头,则它不会被验证,并且不会检查APK 包中的declare-styleable 等。 现在自定义命名空间非常容易实现,如 GitHub 中的 code snippet 所示。最后,可以通过使用LayoutInflater.Factory 并在扩展视图之前调用setFactory 来将自定义XML 属性应用于“普通”小部件。将它们放在一起,您就拥有了一个高度主题化、XML 驱动的应用程序,例如 Fede 的 UberMusic。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多