2011-10-11 18 views
5

Tengo el siguiente problema: Quiero agregar una vista personalizada (custom_view.xml y clases CustomView.java asociadas) a mi actividad principal.Android: cómo hacer que findViewById (R.id.xxx) trabaje en una clase heredando/extendiendo desde la clase View?

Por lo tanto, hago lo siguiente:

1) En mi actividad principal (vinculada a Main.xml):

CustomView customView = new CustomView(this); 
mainView.addView(customView); 

2) En mi clase CustomView.java (que yo quiero vincular a custom_view.xml):

public class CustomView extends View { 

public CustomView(Context context) 
{ 
super(context); 

/* setContentView(R.layout.custom_view); This doesn't work here as I am in a class extending from and not from Activity */ 

TextView aTextView = (TextView) findViewById(R.id.aTextView); // returns null 

///etc.... 
} 

} 

mi problema es que aTextView sigue siendo igual a null ... parece claramente debido al hecho de que mi custom_view.xml no está vinculada a mi clase CustomView.java. ¿Cómo puedo hacer este enlace? De hecho, probé setContentView (R.layout.custom_view); pero no funciona (error de compilación) ya que mi clase se extiende desde la clase View y no la clase Activity.

Gracias por su ayuda !!

+0

¿no deberías estar inflando tu xml en algún momento? – njzk2

+0

Gracias njzk2. Parece que debería inflar mi xml. Cómo puedo hacer eso ? (gracias por su respuesta en caso de que no encuentre ningún blog sobre este tema) –

Respuesta

12

Si consigo que correctamente, usted está tratando de construir CustomView de LayoutFile (R.layout.custom_view). Desea encontrar una vista de texto de ese archivo de diseño. ¿Está bien?

Si es así, debe inflar el archivo de diseño con el contexto que tenga. Luego puede encontrar la vista de texto desde el archivo de diseño.

Pruebe esto.

LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View v = inflater.inflate(R.layout.custom_view, null); 
TextView aTextView = (TextView) v.findViewById(R.id.aTextView); 
0

Intenta inflar la vista personalizada.

En segundo lugar, tratar (supongo que aTextView ID está presente en el lado CustomView)

TextView aTextView = (TextView) mainView.findViewById(R.id.aTextView); 
1

Yo sugeriría que usted intente esto:

TextView aTextView = (TextView) ((Activity)this.getContext()).findViewById(R.id.aTextView); 

que trabajó para mí !!!

Cuestiones relacionadas