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.
- ¿Cómo utilizar la biblioteca JNI compilada por NDK en una aplicación Java normal no Android?
- ¿Por qué el VoiceListener basado en Glass / GDK sólo captura VoiceCommand una vez en XE16?
- Cómo determinar si la tarea del temporizador ha finalizado
- SharedPreferences no se guardará si la aplicación se vuelve a abrir
- Desbordamiento de pila al utilizar Retrofit rxjava concatWith
Podría hacer una referencia estática fuera, y usarla dentro, pero ¿es correcto? ¿Parece extraño tener que hacer eso todo el tiempo?
- No se puede encontrar la clase de símbolo "Generated" para Dagger 2
- Y no importar R.java
- Android.content.res.Resources $ NotFoundException: Cadena de recursos ID # 0x0
- Cambiar String-Array en Strings.xml a ArrayList
- Creación de la caja de conmutación onClickListener para TextView
- Implementación de JPA para Android Development
- Cómo enviar el archivo binario y el texto usando el mismo socket
- Comercio con método de declaración sincronizado en java?
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.
- Vista previa web de NameNotFoundException
- Simulación de servidor de actualización cuadrada para pruebas