Пользовательские атрибуты в фрагментах Android - PullRequest
32 голосов
/ 27 декабря 2011

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

Ответы [ 2 ]

81 голосов
/ 16 июля 2013

Ссылка для Support4Demos изменена или может быть изменена, чтобы опубликовать полное решение. Здесь это идет.

  1. Создание 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> 
    

  2. Переопределить 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();
    }
    
  3. Передайте эти атрибуты в файл макета следующим образом. Просто пример

    <?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. попробуйте очистить проект снова и снова. Это жалко, но затмение и адт иногда плохо себя ведет.

Надеюсь, это поможет другим:)

Приветствия

1 голос
/ 03 мая 2013
@Override
public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {
    super.onInflate(activity, attrs, savedInstanceState); 
    // Your code here to process the attributes
}
...