Entonces el título lo dice todo. Recibo un error de compilación dentro de mi onClick
.
Aquí está el código.
public class fieldsActivity extends Activity {
Button addSiteButton;
Button cancelButton;
Button signInButton;
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// to create a custom title bar for activity window
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.fields);
// use custom layout title bar
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.topbar);
Pager adapter = new Pager();
ViewPager mPager = (ViewPager) findViewById(R.id.fieldspager);
mPager.setAdapter(adapter);
mPager.setCurrentItem(1);
addSiteButton = (Button) findViewById(R.id.addSiteButton);
addSiteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPager.setCurrentItem(2, true); //Compilation error happens here.
}
});
cancelButton = (Button) findViewById(R.id.cancel_button);
signInButton = (Button) findViewById(R.id.sign_in_button);
}
Respuestas:
Si no desea que sea final, siempre puede convertirlo en una variable global.
fuente
Puede declarar la variable final o convertirla en una variable de instancia (o global). Si lo declara definitivo, no podrá cambiarlo más tarde.
Cualquier variable definida en un método y a la que acceda una clase interna anónima debe ser final. De lo contrario, podría usar esa variable en la clase interna, sin saber que si la variable cambia en la clase interna, y luego se usa más adelante en el alcance adjunto, los cambios realizados en la clase interna no persistieron en el alcance adjunto. Básicamente, lo que sucede en la clase interior se queda en la clase interior.
Escribí una explicación más detallada aquí . También explica por qué las variables globales y de instancia no necesitan ser declaradas finales.
fuente
El error lo dice todo, cambia:
a
fuente
final
, en Java habla. Junto con la ausencia de parámetros por referencia, esta regla garantiza que los locales solo se asignen en el método al que pertenecen. Por tanto, el código es más legible.addSiteButton.setOnClickListener(new View.OnClickListener() {
¿tiene alguna idea de por qué estaría surgiendo?null
. Probablemente, findViewById está regresandonull
. No puedo decir más, no siendo programador de Android; Le aconsejo que abra una pregunta separada. Ciertamente, no tiene nada que ver con las clases internas, final, et similia .Aquí tienes una respuesta divertida.
Puede declarar una matriz final de un elemento y cambiar los elementos de la matriz todo lo que aparentemente desee. Estoy seguro de que rompe la razón por la que esta regla del compilador se implementó en primer lugar, pero es útil cuando estás en un límite de tiempo como yo lo estaba hoy.
De hecho, no puedo reclamar crédito por este. ¡Fue la recomendación de IntelliJ! Se siente un poco loco. Pero no parece tan malo como una variable global, así que pensé que valía la pena mencionarlo aquí. Es solo una solución al problema. No necesariamente el mejor.
fuente
Como dijo @Veger, puede hacer
final
que la variable se pueda usar en la clase interna.Lo llamé en
pager
lugar demPager
porque lo está usando como una variable local en elonCreate
método. Elm
prefijo se reserva habitualmente para las variables miembro de la clase (es decir, las variables que se declaran al principio de la clase y están disponibles para todos los métodos de la clase).Si realmente necesita una variable miembro de clase, no funciona para que sea final porque no puede usar
findViewById
para establecer su valor hastaonCreate
. La solución es no utilizar una clase interna anónima. De esta manera, lamPager
variable no necesita ser declarada final y puede usarse en toda la clase.fuente
fuente