Tengo una actividad que tiene diferentes TextView. Ahora, al hacer clic en cada TextView, debería abrir otra actividad. Implementé una forma genérica porque quería eliminar el código redundante. Entonces, solo quería preguntarle su opinión si estoy usando el concepto genérico en Java de manera correcta y si usaría un enfoque similar para configurar los oyentes en múltiples vistas en Android.
(Usé nombres genéricos con fines de demostración y no quería usar la declaración onClick en el diseño xml):
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView activity1 = (TextView) findViewById(R.id.activity1); TextView activity2 = (TextView) findViewById(R.id.activity2); TextView activity3 = (TextView) findViewById(R.id.activity3); TextView activity4 = (TextView) findViewById(R.id.activity4); setOnClickListener(activity1, Activity1.class); setOnClickListener(activity2, Activity2.class); setOnClickListener(activity3, Activity3.class); setOnClickListener(activity4, Activity4.class); } private void setOnClickListener (TextView textView, final Class<? extends AppCompatActivity> activityClass){ textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent activityIntent = new Intent(MainActivity.this, activityClass); startActivity(activityIntent); } }); }}
Recomendaría anular View.OnClickListener. Desacoplar el código de la actividad tiene el beneficio adicional de desacoplar su lógica de la propia actividad, por lo que podría usar GenericClickListener en diferentes contextos. Algo como esto:
public class GenericClickListener implements View.OnClickListener { public GenericClickListener(Activity activity, Class<? extends AppCompatActivity> activityClass) { @Override public void onClick(View v) { Intent activityIntent = new Intent(activity, activityClass); startActivity(activityIntent); } } }Y luego en tu método onCreate():
TextView activity1 = (TextView) findViewById(R.id.activity1); TextView activity2 = (TextView) findViewById(R.id.activity2); TextView activity3 = (TextView) findViewById(R.id.activity3); TextView activity4 = (TextView) findViewById(R.id.activity4); activity1.setOnClickListener(new GenericClickListener(thia, Activity1.class)); activity2.setOnClickListener(new GenericClickListener(this, Activity2.class)); activity3.setOnClickListener(new GenericClickListener(this, Activity3.class)); activity4.setOnClickListener(new GenericClickListener(this, Activity4.class));Aparte de eso, su implementación parece un enfoque razonable.
si este código funciona, es un concepto bastante bueno. yo haría así
Estaba creando mi propia solución para eso, y encontré este hilo mientras buscaba elementos existentes. El siguiente fragmento de código funciona (la respuesta de @RaceYouAnytime tiene algunos errores) y le permite usar Activity O Fragment para instanciar su StartActivity OnClickListener`
public class StartActivityOnClickListener implements View.OnClickListener { private Activity sourceActivity; private Class<?> destinationActivityClass; /** * Constructor to use in Activities * */ public StartActivityOnClickListener(Activity srcActivity, Class<? extends AppCompatActivity> dstActivityClass) { this.sourceActivity = srcActivity; this.destinationActivityClass = dstActivityClass; } /** * Constructor to use in Fragments * */ public StartActivityOnClickListener(Fragment srcFragment, Class<? extends AppCompatActivity> dstActivityClass) { this.sourceActivity = srcFragment.getActivity(); this.destinationActivityClass = dstActivityClass; } /** * Overridden onClick() method building the Intent and calling startActivity() with it */ @Override public void onClick(View v) { sourceActivity.startActivity(new Intent(sourceActivity, destinationActivityClass)); } }El uso sigue siendo el mismo, de la siguiente manera
yourObject.setOnClickListener(new StartActivityOnClickListener(this, YourActivity.class));