¿Por qué funciona este código Java? Compilador no se queja de cierre
Mi DialogFragment contiene un botón -inicialmente invisible- OK y un ListView de elementos que se pueden hacer clic. Cuando se hace clic en alguno de los elementos ListView, establezco la visibilidad del botón VISIBLE.
Esto se hace a través de un OnItemClickListener anónimo. El código de abajo funciona pero no entiendo por qué. Dado que Java no soporta cierres, espero que el compilador se queje de que el botón no sea definitivo.
- Cambiar el color de línea inferior de EditText con appcompat v7
- Detección de Android de desinstalación e intención abierta
- Cómo comprobar si un cuerpo casi ha dejado de moverse en libgdx + box2d
- ¿Transferir un archivo entre dispositivos Android?
- No se puede entender mHandler.obtainMessage () en la muestra Bluetooth de Android
¿No es este el caso típico de un cierre? ¿Por qué el código siguiente no produce un error de compilador?
Gracias
public class AlternativeRoomsDialog extends DialogFragment { private Button okButton; static AlternativeRoomsDialog newInstance(String name) { AlternativeRoomsDialog f = new AlternativeRoomsDialog(); return f; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_alternative_rooms, container); getDialog().setTitle("Change Room"); ListView lv = (ListView) view.findViewById(R.id.alternative_rooms_list); final adapter = /*some initialization*/; lv.setAdapter(adapter); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View linlay, int position, long id) { okButton.setVisibility(View.VISIBLE); ListView lv = (ListView) linlay.getParent(); int total = lv.getChildCount(); for (int i=0; i< total; i++){ lv.getChildAt(i).setBackgroundColor(Color.BLUE); } linlay.setBackgroundColor(Color.GREEN); } }); // setup OK button okButton = (Button) view.findViewById(R.id.btn_ok); okButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(AlternativeRoomsDialog.this.getActivity(), "ok button clicked", Toast.LENGTH_SHORT).show(); } }); return view; }
}
- ¿Cómo se obtiene el tipo de un cursor?
- Utilizar IExtendedNetworkService para obtener respuesta de USSD en Android
- Problema al analizar cadena xml en java
- ¿Qué es una NullPointerException y cómo puedo solucionarlo?
- La Interfaz de JavaScript de WebView sólo parece funcionar a través de Instant-Run de Android Studio, pero no cuando se compila a través de gradle regular
- Button.setBackground (dibujable fondo) lanza NoSuchMethodError
- ¿Cómo extraer archivos sin extensión del directorio de almacenamiento externo?
- Android: extiende Linearlayout, pero necesita lo mismo para RelativeLayout. Código duplicado inevitable?
El requisito de que las variables sean declaradas finales sólo se aplica a las variables locales, ya que son las que salen del alcance cuando el método devuelve. Su botón está referenciado por una variable miembro, y no hay necesidad de que sea final: el miembro no irá a ninguna parte siempre y cuando el objeto exista.
No es necesario que la variable de instancia final
, que es sólo el caso con las variables locales. Las variables locales deben ser final
, se copian a la clase anónima que se utiliza dentro del método, como variables de instancia de esa clase. Esto se hace porque la instancia de clase interna anónima puede permanecer en memoria de montón, después de devuelve el método. Por lo tanto, puede requerir el acceso a la variable incluso después de que el marco de la pila del método se desasigna.
Ahora, puesto que hay 2 copias de las variables locales, pueden salir de la sincronización, si la variable local se cambia fuera de la clase interna anónima. Eso sería realmente extraño, por eso es necesario que la variable local final
.
Al igual que con las variables de instancia , son compartidas entre la instancia de clase cerrada y la instancia de clase interna anónima. Por lo tanto, no es necesario que sean final
.
- ¿Hay un equivalente en iOS para el Android ProgressDialog
- Grabar vídeo desde la cámara en Android a mp4