2011-12-27 22 views
28

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

+0

がエラーを取得: '... \アプリ\ RES \レイアウト\のselect_category.xml:26:エラー:属性のshowRadioButtonsが見つかりませんリソース識別子を'com.companyX.projectY' ... \ app \ res \ layout \ select_category.xml:26:エラー: 'com.companyX.projectY'パッケージの属性 'highlightSelection'のリソース識別子が見つかりません .. 。com:appcompanyX.projectY ' – Anton

+0

app xml namespaceとdeclare-stylableに書かれている属性' unselectedColor 'のリソース識別子が見つかりませんでした。\ app \ res \ layout \ select_category.xml:26:間違いなく必要に応じてそれらを提供することができます – Anton

答えて

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

動作しますが、リントマーカーをクリアするようにしてください(Android Tools> Clear Lint Markers)。なぜビルドしていないのか分かりませんでした。 – tdevaux

+0

ありがとうtdevaux、私はこれを再読する前に5分しかかかりませんでした。私は私の人生で5分以上利用可能です! – dhaag23

71

サポート4Demosのリンクが変更されたり、完全なソリューションを投稿するように変更することができます。ここに行く。

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

    /** 
    * 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(); 
    } 
    
  2. <?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> 
    
    フラグメントの

  3. オーバーライドonInflateデリゲートと読み属性は次のようにあなたのレイアウトファイルでこれらの属性を渡します。ただ、たとえば、すべてのthats

    <?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で名前空間エラーが発生した場合にこれを実行します。 プロジェクトのクリーニングを何度も試みてください。 これは哀れですが、時には日食と誤解を招くことがあります。

は、それが他の人の役に立てば幸い:)コンパイル中

乾杯

+2

私のAndroidスタジオはXMLでカスタム属性を表示し続けていましたが、赤い下線はエラーがあることを示していますが、プロジェクト全体がうまく構築されています。レイアウトファイルのエラーを正しく見ていないと思うかもしれない人のためのFYI。 – Pocha

+1

xmlns:app = "http://schemas.android.com/apk/res/com.yourapp.packagename"の代わりに 'http:// schemas.android.com/apk/res-auto'を使用すると自動 - 代替パッケージ名。 http://stackoverflow.com/questions/10448006/xml-namespace-declaration-auto-substitute-package-name –

+0

[OK]を私は前に1つを逃した。私のように、これをいくつかの場所から貼り付けてコピーしたら、注意を払い、名前空間が一致することを確認してください。 ** xmlns:$ {NameSpace} **および** $ {NameSpace} **属性で同じ:attribute = "..." – TacB0sS