web-dev-qa-db-ja.com

Androidフラグメントのカスタム属性

カスタムコントロールの_declare-styleable_のようなXMLを使用して(バンドル追加パラメーターを使用せずに)Androidフラグメントでカスタム属性を定義したいのですが、AttrSetパラメーターを持つコンストラクターはありません。それは可能ですか?属性のサポートを得るためにpublic void onInflate(Android.app.Activity activity, Android.util.AttributeSet attrs, Android.os.Bundle savedInstanceState)をオーバーライドすることはできますか?

33
Anton

Support4Demosのリンクが変更されているか、変更される可能性があるため、完全なソリューションを投稿してください。ここに行きます。

  1. 作成する attrs.xml res/valuesフォルダー内のファイル。または、ファイルがすでに存在する場合は、以下のコンテンツを追加します。

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <declare-styleable name="MyFragment">
        <attr name="my_string" format="string"/>
        <attr name="my_integer" format="integer"/>
    </declare-styleable> 
    
  2. オーバーライドする onInflate フラグメントのデリゲートとその中の読み取り属性

    /**
     * Parse attributes during inflation from a view hierarchy into the
     * arguments we handle.
     */
    @Override
    public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {
        super.onInflate(activity, attrs, savedInstanceState);
        Log.v(TAG,"onInflate called");
    
        TypedArray a = activity.obtainStyledAttributes(attrs,R.styleable.MyFragment);
    
        CharSequence myString = a.getText(R.styleable.MyFragment_my_string);
        if(myString != null) {
            Log.v(TAG, "My String Received : " + myString.toString());
        }
    
        int myInteger = a.getInt(R.styleable.AdFragment_my_integer, -1);
        if(myInteger != -1) {
            Log.v(TAG,"My Integer Received :" + myInteger);
        }
    
        a.recycle();
    }
    
  3. これらの属性を次のようにレイアウトファイルに渡します。ほんの一例

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:app="http://schemas.Android.com/apk/res-auto"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" >
    
        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="This is Android activity" />
    
        <fragment
            Android:id="@+id/ad_fragment"
            Android:name="com.yourapp.packagename.MyFragment"
            Android:layout_width="fill_parent"
            Android:layout_height="50dp"
            Android:layout_alignParentBottom="true"
            app:my_string="Hello This is HardCoded String. Don't use me"
            app:my_integer="30" />
    
    </RelativeLayout>
    

それで全部です。その実用的なソリューション。

これを行っているときに、xmlに名前空間エラーが表示された場合。プロジェクトのクリーニングを何度も試してください。これは哀れですが、Eclipseとadtが誤動作することがあります。

それが他の人に役立つことを願っています:)

乾杯

81
Javanator
@Override
public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {
    super.onInflate(activity, attrs, savedInstanceState); 
    // Your code here to process the attributes
}
1
theelfismike