Android: un método findViewById () que devuelve valores que no necesitamos emitir

Como estoy cansado de escribir un operador de cast para CADA Activity.findViewById() que devuelve View crudo, finalmente traté de una manera que fue sugerido por Internet .

 public abstract class MyActivity extends Activity { @SuppressWarnings("unchecked") protected <T extends View> T findViewByID(int id) { return (T) this.findViewById(id); } } 

Tenga en cuenta que esto no está sobrecargado (el último "D" es mayúsculas). El compilador dice que no podemos lanzar View en T ¿Hay algo malo en mi implementación? Curiosamente, esta sugerencia apenas se veía en los sitios web en inglés (por ejemplo, incluso en nuestra encantadora desbordamiento de pila), y la excepción era el sitio publicado anteriormente.

Esto funciona bien en mi proyecto de prueba. No hay error de compilador: captura de pantalla

Para ser honesto, este enfoque añade una sutil complejidad sobrecarga para el próximo mantenedor de Android (que estaría acostumbrado al método de casting) para guardar algunos caracteres en los archivos de código.

Propondría lanzar las vistas de la manera tradicional, o optar por una solución basada en la reflexión como Roboguice .

Solucioné esto usando un eclipse-builder personalizado que genera clases con referencias para cada archivo de diseño, porque:

  • Es de tipo seguro y fácil de usar
  • RoboGuice y todas las demás API basadas en la reflexión son muy lentas en Android.

En mi opinión, esta es la manera más limpia y más eficiente de resolver este problema.

Vea mi esencia aquí para el constructor: https://gist.github.com/fab1an/10533872

Diseño: test.xml

 <?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" > <TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/text1" /> <ScrollView android:id="@+id/scroll" android:layout_width="match_parent" android:layout_height="350px" android:layout_below="@id/text2" android:layout_marginTop="50px" /> </merge> 

uso: TestView.java

 public final class TestView extends RelativeLayout { //~ Constructors --------------------------------------------------------------------------------------------------- private final ViewRef_test v; public TestView(final Context context) { super(context); LayoutInflater.from(context).inflate(R.layout.test, this, true); this.v = ViewRef_test.create(this); this.v.text1.setText(); this.v.scroll.doSomething(); } } 

archivo generado (en gen/ ): ViewRef_test.java

 package org.somecompany.somepackage; import android.view.*; import android.widget.*; import java.lang.String; @SuppressWarnings("unused") public final class ViewRef_test { public final TextView text1; public final TextView text2; public final ScrollView scroll; private ViewRef_test(View root) { this.text1 = (TextView) root.findViewById(R.id.text1); this.text2 = (TextView) root.findViewById(R.id.text2); this.scroll = (ScrollView) root.findViewById(R.id.scroll); } public static ViewRef_test create(View root) { return new ViewRef_test(root); } } 
  • Casting to Button es redundante - ¿Por qué?
  • getActivity (). findViewById (R.layout.contacts_list_view) devuelve null
  • La diferencia entre LayoutInflater.inflate y findViewById
  • FindViewById devuelve el elemento erróneo?
  • Usando findviewbyid en una clase que NO extiende Actividad en android
  • Android findViewById () en la vista personalizada
  • Huh? FindViewById () no se puede llamar dentro de onReceive ()?
  • ¿Cómo puedo asignar un ID a una vista mediante programación?
  • Cómo inflar correctamente un diseño con un ViewFlipper anidado?
  • ¿Cómo puedo encontrar el ID de un fragmento? Alternativamente, ¿cómo doy al fragmento una identificación?
  • Android: ¿cómo puedo acceder a las vistas (utilizando findViewById) de una actividad de un fragmento onCreateView ()?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.