Android Fragments Android片段中的自定义属性

thigvfpy  于 2022-12-29  发布在  Android
关注(0)|答案(2)|浏览(177)

我想在Android片段中使用XML定义自定义属性(不使用捆绑包附加参数),如自定义控件中的declare-styleable。但是没有带AttrSet参数的构造函数,所以可以吗?我可以覆盖public void onInflate(android.app.Activity activity, android.util.AttributeSet attrs, android.os.Bundle savedInstanceState)以获得属性支持吗?

a0x5cqrl

a0x5cqrl1#

Support 4Demos的链接已更改或可以更改,因此请发布完整的解决方案。
1.在res/values文件夹中创建attrs.xml文件。如果文件已存在,则添加以下内容。

<?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>

1.重写fragment的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();
 }

1.在布局文件中传递这些属性,如下所示

<?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有时会行为不端。

p4rjhz4m

p4rjhz4m2#

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

相关问题