2011-12-27 21 views
28

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

+0

producen errores durante la compilación: '... \ app \ res \ layout \ select_category.xml: 26: Error: No se encontró identificador de recursos para el atributo 'showRadioButtons 'en paquete' com.companyX.projectY ' ... \ app \ res \ layout \ select_category.xml: 26: error: no se ha encontrado ningún identificador de recurso para el atributo' highlightSelection 'en el paquete' com.companyX.projectY ' .. . \ app \ res \ layout \ select_category.xml: 26: error: no se ha encontrado ningún identificador de recurso para el atributo 'unselectedColor' en el paquete 'com.companyX.projectY'' – Anton

+0

aplicación espacio de nombres xml y declare-stylable se escriben corr ectly. puede proporcionarlos, si es necesario – Anton

Respuesta

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

Funciona, pero asegúrese de borrar los marcadores de Lint (herramientas Android> Clear Lint Markers). ¡Pasé 10 minutos tratando de descubrir por qué no estaba creciendo! – tdevaux

+0

Gracias tdevaux, solo pasé 5 minutos antes de volver a leer esto. ¡Tengo 5 minutos más disponibles en mi vida! – dhaag23

71

El enlace para Support4Demos se cambia o se puede cambiar, por lo que se publica la solución completa. Aquí va.

  1. Crear attrs.xml archivo en res/valores carpeta. 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. Sustituir el delegado onInflate del fragmento y leer atributos en que

    /** 
    * 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. pasar estos atributos en el archivo de diseño de la siguiente manera. Sólo 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. intente limpiar el proyecto una y otra vez. Esto es patético pero el eclipse y adt se comporta mal a veces.

espero que ayude a otros :)

Saludos

+2

Mi estudio Android siguió mostrando los atributos personalizados en XML con subrayado rojo que indica que hay un error, pero todo el proyecto fue perfecto. FYI para alguien que pueda pensar que no lo está haciendo bien mirando esos errores en su archivo de diseño. – Pocha

+1

puede usar 'http: // schemas.android.com/apk/res-auto' en lugar de xmlns: app =" http://schemas.android.com/apk/res/com.yourapp.packagename "en auto -sustituto del nombre del paquete. http://stackoverflow.com/questions/10448006/xml-namespace-declaration-auto-substitute-package-name –

+0

OK, me he perdido el anterior. Si tú, como yo, copiamos esto pegado de un par de lugares, presta atención y asegúrate de que los espacios de nombres coincidan, p. ** xmlns: $ {NameSpace} ** y lo mismo en el atributo ** $ {NameSpace} **: attribute = "..." – TacB0sS

Cuestiones relacionadas