1

我用 android 开发不到两个月,我认为这是一个很棒的工具,现在我已经开始我的项目来扩展一些视图以添加新功能(例如:使用自定义字体),但我有一个问题,有一个 WPF 功能(.NET 框架)在这种情况下非常有用,无需扩展类。

这称为Attached Property,基本上是将新属性添加到现有类的能力。

普通安卓示例

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:my="http://schemas.android.com/apk/res/com.package.custom"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:orientation="vertical">

    <com.package.CustomTextView  
        android:layout_width="fill_parent" 
        android:text="@string/hello" 
        android:layout_height="wrap_content" 
        android:id="@+id/TextView01" 
        android:textColor="@colors/text_color"
        my:fontface="fonts/my-custom-font.ttf"
        my:autosize="true"/>

    <com.package.CustomButton
        android:id="@+id/btn_continue"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/text_btn"
        my:fontface="fonts/my-custom-btn-font.ttf" /> 
</LinearLayout>

定期添加这样的功能必须扩展 TextView 类,但使用附加属性可以做到这一点

附加属性示例

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:my="http://schemas.android.com/apk/res/com.package.custom"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:orientation="vertical">

    <!-- there is no need to extend the class -->
    <TextView  
        android:layout_width="fill_parent" 
        android:text="@string/hello" 
        android:layout_height="wrap_content" 
        android:id="@+id/TextView01" 
        android:textColor="@colors/text_color"
        my:fontface="fonts/my-custom-font.ttf"
        my:autosize="true"/>

    <Button
        android:id="@+id/btn_continue"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/text_btn"
        my:fontface="fonts/my-custom-btn-font.ttf" /> 
</LinearLayout>

这节省了很多工作,因为我们不仅可以与 TextView 一起使用,还可以与其他类一起使用

4

1 回答 1

0

抱歉,您不能发明用于现有类的新属性并使用标准的膨胀机制。对于初学者来说,没有地方可以将这些数据存储在View.

话虽如此,没有什么能阻止您使用第二个 XML 块中的语法。只是LayoutInflater会忽略无法识别的东西(并且构建工具可能会抱怨)。你可以:

  • 尝试克隆LayoutInflater到您自己的应用程序中,并使用与您的自定义属性相关的其他功能来增强它,或者

  • 自己将布局 XML 加载Resources到 中XmlResourceParser,遍历它以查找所有自定义属性,并将它们应用于由常规扩展的小部件LayoutInflater

后者虽然更麻烦,但可能更容易实现(LayoutInflater可能在 SDK 之外有很多依赖项)并且应该更容易维护(LayoutInflater可能会随着时间而改变,需要重新报告)。

于 2013-03-19T18:27:05.490 回答