Пользовательские атрибуты в фрагментах Android - программирование
Подтвердить что ты не робот

Пользовательские атрибуты в фрагментах Android

Я хотел бы определить пользовательские атрибуты в фрагменте Android, используя XML (без использования дополнительных параметров пакета), например declare-styleable в пользовательских элементах управления. Но нет конструкторов с параметрами AttrSet, так возможно ли это? Могу ли я просто переопределить public void onInflate(android.app.Activity activity, android.util.AttributeSet attrs, android.os.Bundle savedInstanceState), чтобы получить поддержку атрибутов?

4b9b3361

Ответ 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
}