カスタムコントロールの_declare-styleable
_のようなXMLを使用して(バンドル追加パラメーターを使用せずに)Androidフラグメントでカスタム属性を定義したいのですが、AttrSetパラメーターを持つコンストラクターはありません。それは可能ですか?属性のサポートを得るためにpublic void onInflate(Android.app.Activity activity, Android.util.AttributeSet attrs, Android.os.Bundle savedInstanceState)
をオーバーライドすることはできますか?
Support4Demosのリンクが変更されているか、変更される可能性があるため、完全なソリューションを投稿してください。ここに行きます。
作成する 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>
オーバーライドする 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();
}
これらの属性を次のようにレイアウトファイルに渡します。ほんの一例
<?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が誤動作することがあります。
それが他の人に役立つことを願っています:)
乾杯
@Override
public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {
super.onInflate(activity, attrs, savedInstanceState);
// Your code here to process the attributes
}