Concepto de clase interna de Android y Java
I seguido el enlace http://developer.android.com/reference/android/app/AlertDialog.html e intento crear nuevo AlertDialog como este
AlertDialog myAlertDialog = new AlertDialog.Builder(MainActivity.this).create();
Como por el documento AlerDialog es la clase externa y Builder es la clase interna dentro de AlertDialog. Ahora he vinculado el mismo concepto con java en el acceso a la clase interna como este Outer myOuter2 = new Outer.Inner();
Esta pieza de da error cuando intento acceder, aquí está el código java completo
- Notification pendingIntent contentIntent falla cuando terminan las llamadas de actividad ()
- ¿Cómo mejorar el tiempo de inicio de una aplicación para Android?
- ¿Es bueno tener un DatabaseManager con todas las funciones de todos los objetos del modelo?
- ¿Cómo capturar perfectamente la Java NullPointerException en la operación o = objectA.objectB.objectC?
- DecodeByteArray y copyPixelsToBuffer no funcionan. SkImageDecoder :: Factory devuelto null
package com.test; public class Outer { public void OuterMethod() { System.out.println("OuterMethod"); } public static void main(String[] args) { Outer myOuter = new Outer(); myOuter.OuterMethod(); Outer myOuter2 = new Outer.Inner();//this piece of code gives error } class Inner { Inner() { System.out.println("constructor Inner"); } public void InnerMethod() { System.out.println("Inside InnerMethod"); } } }
Así que mi pregunta aquí es cómo entender el mismo concepto de clase interna en android y acceder a los métodos dentro de ese
- Formato de moneda en Android utilizando separador decimal incorrecto
- Problema al asignar una instancia de calendario a otra
- ¿Qué es una buena biblioteca para analizar expresiones matemáticas en java?
- Autenticación con Active Directory a través de Kerberos
- No se pueden abrir archivos XML en Diseño gráfico: FakeAdapter no se puede convertir en BaseAdapter
- com.google.android.maps.MapView ClassNotFoundException
- Android M permiso de la prueba READ_PHONE_STATE (permisos peligrosos)
- Cómo validar String usando expresión regular en java
Ha creado una clase interna no estática (una clase de instancia interna), mientras que AlertDialog.Builder
es una clase estática.
Para conseguir que su código funcione como es usted necesita una manera interesante de invocar new
que va como esto:
Outer.Inner myOuter2 = myOuter.new Inner();
Esto se debe a que actúa como cualquier otro campo no estático en el exterior – que requiere una instancia de exterior para ser válido. En cualquier caso, esto no suele ser una buena idea ya que las clases públicas no estáticas son raras.
Lo más probable es que Inner
sea una clase estática, es decir, una declarada como:
static class Inner {
Esencialmente esto desacopla a Inner
de su clase contenedora, simplemente pasa a vivir dentro de ella y así puede ser instanciada a través de new Outer.Inner()
. Podría vivir felizmente como una clase pública por derecho propio en un nuevo archivo .java en su lugar.
Las clases estáticas internas son útiles cuando la clase interna se utiliza solamente en relación con la clase externa, por lo que muestra la relación entre ellas.
En el caso de Android, se utiliza un AlertDialog.Builder
sólo cuando se AlertDialog
un AlertDialog
. Si se tratara de un Builder
general utilizado por otras clases (por ejemplo, un cuadro de Dialog
normal) se habría declarado como su propia clase pública (es decir, una clase independiente que no está anidada dentro de otra).
No hay relación entre Outer
e Inner
excepto que comparten un archivo de clase. Por lo tanto, no puede escribir:
Outer myOuter2 = new Outer.Inner();
Tal vez usted quiso decir:
Outer.Inner myInner = new Outer.Inner();
La clase Inner
tendrá que ser declarada como static
para que esto funcione.
Tenga en cuenta que un constructor normal devolverá un tipo que es igual al tipo de inclusión. He aquí un pequeño ejemplo usando nombres de clase similares a su código:
public class Outer { public static void main(String[] args) { Outer outer = new Outer.Builder().withParam("foo").build(); } private final String someParam; private Outer(String someParam) { this.someParam = someParam; } public static class Builder { private String someParam; public Builder() { } public Builder withParam(String value) { this.someParam = value; return this; } public Outer build() { return new Outer(someParam); } } }
También puede leer el ítem # 2 de Effective Java de Joshua Bloch , 2nd Edition para una buena descripción del diseño y la justificación del constructor. Disponible en línea: aquí .
La clase AlertDialog.Builder
es una clase interna estática como se puede ver aquí .
public static class Builder {...}
Finalmente me di cuenta aquí es el código
package com.test; public class Outer { public void OuterMethod() { System.out.println("OuterMethod"); } public static void main(String[] args) { Outer myOuter = new Outer(); myOuter.OuterMethod(); Outer myOuter2 = new Outer.Inner().InnerMethod(); } static class Inner { Inner() { System.out.println("constructor Inner"); } public Outer InnerMethod() { Outer myOuter = new Outer(); System.out.println("Inside InnerMethod"); return myOuter; } } }
- Cómo evitar que el usuario cierre la aplicación – Android 4.0.3
- Llamada AsyncTask desde receptor de difusión Android