Я хотел бы определить пользовательские атрибуты в фрагменте Android, используя XML (без использования дополнительных параметров пакета), например declare-styleable
в пользовательских элементах управления. Но нет конструкторов с параметрами AttrSet, так возможно ли это? Могу ли я просто переопределить public void onInflate(android.app.Activity activity, android.util.AttributeSet attrs, android.os.Bundle savedInstanceState)
, чтобы получить поддержку атрибутов?
Пользовательские атрибуты в фрагментах Android
Ответ 1
Ссылка для 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. попробуйте очистить проект снова и снова. Это жалко, но иногда затмение и неправильное поведение.
Надеюсь, что это поможет другим:)
Приветствия
Ответ 2
@Override
public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {
super.onInflate(activity, attrs, savedInstanceState);
// Your code here to process the attributes
}