Atributos personalizados en fragmentos de Android

Me gustaría definir atributos personalizados en el fragmento de Android utilizando XML (sin utilizar parámetros adicionales del paquete) como declare-styleable en los controles personalizados. Pero no hay constructores con los parámetros de AttrSet, por lo que es posible? ¿Puedo anular public void onInflate(android.app.Activity activity, android.util.AttributeSet attrs, android.os.Bundle savedInstanceState) para obtener compatibilidad de atributos?

El enlace para Support4Demos se cambia o se puede cambiar para publicar la solución completa. Aquí va.

  1. Cree el archivo attrs.xml en la carpeta res / values. O agregue el contenido a continuación si el archivo ya existe.

     <?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. Anular el delegado onInflate de fragmento y leer atributos en él

     /** * 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. Pase estos atributos en su archivo de diseño como sigue. Solo un ejemplo

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

Eso es todo. Es una solución de trabajo.

Al hacer esto si ve algún error de espacio de nombres en xml. Trate de limpiar el proyecto una y otra vez. Esto es patético, pero eclipse y adt se comportan mal algunas veces.

Espero que ayude a otros 🙂

Aclamaciones

 @Override public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) { super.onInflate(activity, attrs, savedInstanceState); // Your code here to process the attributes } 
  • NullPointerException en onRestoreInstanceState
  • Mostrar fragmento como un diálogo o como una actividad habitual
  • Desactivar la animación de la transacción de fragmentos después de haberla confirmado
  • Animador de animación personalizada
  • ¿Hay alguna alternativa a Fragmentos anidados?
  • Android Google Maps en Fragmento
  • Android Spinner Dropdown flecha que no se muestra
  • Biblioteca de navegación para automóviles Android
  • Cambiar fragmentos de forma programática
  • Fragmento de actualización de ViewPager en el dispositivo
  • ¿Cómo puedo implementar el desplazamiento horizontal sin utilizar la biblioteca de soporte?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.