1

私はAndroidで開発して2か月足らずで、素晴らしいツールだと思います。今、いくつかのビューを拡張して新しい機能を追加するプロジェクトを開始しました(例:カスタムフォントを使用する)が、質問があります。WPF機能があります。 (。NETフレームワーク)これは、クラスを拡張せずに、このようなときに非常に便利です。

これは添付プロパティと呼ばれ、基本的には既存のクラスに新しいプロパティを追加する機能です。

通常の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クラスを拡張する必要がありますが、AttachedPropertyを使用するとこれを実行できます

添付物件の例

<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

そうは言っても、2番目のXMLブロックで構文を使用することを妨げるものは何もありません。認識されないものを無視するだけLayoutInflaterです(そしてビルドツールが不平を言うかもしれません)。あなたは出来る:

  • 独自のアプリにクローンを作成LayoutInflaterし、カスタム属性に関連する追加機能でアプリを拡張してみてください。

  • から自分でレイアウトXMLをロードし、ResourcesそれXmlResourceParserをウォークしてすべてのカスタム属性を見つけ、それらを通常のウィジェットによって拡張されたウィジェットに適用します。LayoutInflater

後者は、より面倒ですが、達成が容易であり(LayoutInflaterSDKの外部に多くの依存関係がある可能性があります)、保守が容易である必要があります(LayoutInflater時間の経過とともに変化し、再移植が必要になる可能性があります)。

于 2013-03-19T18:27:05.490 に答える