Dentro de OnClickListener No puedo tener acceso a muchas cosas – cómo acercarme?

Dentro de un OnClickListener No puedo acceder a la mayoría de las variables "fuera" del ámbito, como esto:

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 ya que no tengo el Contexto disponible dentro del OnClickListener.

Podría hacer una referencia estática fuera, y usarla dentro, pero ¿es correcto? ¿Parece extraño tener que hacer eso todo el tiempo?

Sustituya this en su código por MyActivity.this donde MyActivity es el nombre de clase de su subclase Activity.

Explicación: Está creando una clase interna anónima cuando utiliza esta parte de su código:
new OnClickListener() {
Las clases internas anónimas tienen una referencia a la instancia de la clase en la que se crean. Parece que lo está creando dentro de una subclase de Activity porque findViewById es un método Activity. Las actividades son un Contexto, por lo que todo lo que necesitas hacer es usar la referencia que tienes automáticamente.

También puede implementar la interfaz OnClickListener en su clase y evitar la necesidad de una clase interna anónima. Entonces usted fijaría el oyente del tecleo como esto:

findViewById(R.id.Button01).setOnClickListener(this);

Si tiene varios botones utilizando un oyente, puede utilizar una instrucción switch con view.getId () (que corresponde al id de la vista en R.id) para distinguir entre ellos.

Hay algunas cosas que puedes hacer, puedes crear una clase interna que implemente el onClickListener y pasar los argumentos necesarios al constructor de la clase. Todavía no encuentro que el enfoque más limpio. Normalmente sólo creo otro método para realizar mi acción. Así que en el onClick (View v) haría algo como esto.

 onClick(View v){doMyAction(myParams)} private void doMyAction(Object params){//do stuff} 

Y sólo pasar los parámetros necesarios desde el método de escucha al método fuera del oyente.

Cambie el constructor Intent en uso a Intent (contexto, classname) y use getApplicationContext () en su clase interna. Resuelto mi problema de todos modos.

  • Android compartir en Facebook y otras redes sociales
  • Error fatal: Diseño no válido de java.lang.String en value
  • Problema de autenticación de LinkedIn en eclipse
  • La tabla de resultados de Android no funciona después de que la publicación muestre RESULT_APP_MISCONFIGURED error
  • Convertir cadena en formato de fecha
  • ListView - getView se llama demasiadas veces
  • ¿Cómo resolver AVD rotación automática tema de la pantalla en android 4.4.2?
  • NetBeans con NBAndroid - no se puede encontrar el símbolo setContentView (R.layout.main);
  • Cree una biblioteca de Jar Android para su distribución
  • Android.provider.Settings.Secure.ANDROID_ID devuelve "android_id"
  • No se puede iniciar Android Studio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.