附属依赖财产

时间:2013-03-19 17:45:17

标签: android design-patterns

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

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

普通Android示例

<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与其他类一起使用

1 个答案:

答案 0 :(得分:0)

很抱歉,您无法创建用于现有类的新属性并使用标准通胀机制。对于初学者来说,没有地方可以将这些数据存储在View

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

  • 尝试将LayoutInflater克隆到您自己的应用中,并使用与您的自定义属性相关的其他功能对其进行扩充,或者

  • 自己将布局XML从Resources加载到XmlResourceParser,然后查找所有自定义属性,并将其应用于由常规LayoutInflater充气的小部件

后者虽然比较麻烦,但可能更容易实现(LayoutInflater可能在SDK之外有很多依赖关系)并且应该更容易维护(LayoutInflater可能会随着时间的推移而发生变化,需要重新设置-ports)。