Dentro de un OnClickListener no puedo acceder a la mayoría de las variables "fuera" del alcance, así:
findViewById(R.id.Button01).setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Intent mainApps = new Intent(Intent.ACTION_MAIN);
mainApps.addCategory(Intent.CATEGORY_LAUNCHER);
List<ActivityInfo> activities = this.getPackageManager().queryIntentActivities(mainApps, 0);
/*
Intent intent = new Intent("com.sygic.drive/com.sygic/drive/.SygicDriveActivity");
startActivity(intent);*/
}
});
en este ejemplo, necesito obtener el PacketManager, y no puedo obtenerlo porque no tengo el Contexto disponible dentro de OnClickListener.
Podría hacer una referencia estática afuera y usarla adentro, pero ¿es eso correcto? ¿Parece extraño tener que hacer eso todo el tiempo?
Cannot refer to a non-final variable table inside an inner class defined in a different method
? No puedo acceder a esos a través deMyActivity.this
.Activity.this.doStg()
. ¿Puedes adjuntar aquí @LanceNanek alguna URL con una explicación más detallada? ¿Está relacionado de alguna manera con la programación reactiva?También puede implementar la interfaz OnClickListener en su clase y evitar la necesidad de una clase interna anónima. Luego, establecería el oyente al hacer clic de esta manera:
findViewById(R.id.Button01).setOnClickListener(this);
Si tiene varios botones que usan un oyente, puede usar una instrucción de cambio con view.getId () (que corresponde a la identificación de la vista en R.id) para distinguir entre ellos.
fuente
Hay algunas cosas que puede hacer, puede crear una clase interna que implemente onClickListener y pasar los argumentos necesarios al constructor de la clase. Sigo sin encontrar ese enfoque más limpio. Por lo general, solo creo otro método para realizar mi acción. Entonces, en onClick (View v) haría algo como esto.
onClick(View v){doMyAction(myParams)} private void doMyAction(Object params){//do stuff}
Y simplemente pase los parámetros necesarios del método de escucha al método fuera del escucha.
fuente
Cambie el constructor Intent en uso a Intent (contexto, nombre de clase) y use getApplicationContext () en su clase interna. Resolvió mi problema de todos modos.
fuente