我用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与其他类一起使用
答案 0 :(得分:0)
很抱歉,您无法创建用于现有类的新属性并使用标准通胀机制。对于初学者来说,没有地方可以将这些数据存储在View
。
话虽如此,没有什么可以阻止你在第二个XML块中使用语法。只是LayoutInflater
会忽略无法识别的东西(构建工具可能会发牢骚)。你可以:
尝试将LayoutInflater
克隆到您自己的应用中,并使用与您的自定义属性相关的其他功能对其进行扩充,或者
自己将布局XML从Resources
加载到XmlResourceParser
,然后查找所有自定义属性,并将其应用于由常规LayoutInflater
充气的小部件
后者虽然比较麻烦,但可能更容易实现(LayoutInflater
可能在SDK之外有很多依赖关系)并且应该更容易维护(LayoutInflater
可能会随着时间的推移而发生变化,需要重新设置-ports)。