Der Titel sagt also alles. Ich erhalte einen Kompilierungsfehler in meinem onClick
.
Hier ist der Code.
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);
}
Antworten:
Wenn Sie es nicht endgültig machen möchten, können Sie es immer einfach zu einer globalen Variablen machen.
quelle
Sie können die Variable final deklarieren oder als Instanzvariable (oder globale Variable) festlegen. Wenn Sie es für endgültig erklären, können Sie es später nicht mehr ändern.
Jede Variable, die in einer Methode definiert ist und auf die eine anonyme innere Klasse zugreift, muss endgültig sein. Andernfalls könnten Sie diese Variable in der inneren Klasse verwenden, ohne zu wissen, dass die in der inneren Klasse vorgenommenen Änderungen im umschließenden Bereich nicht beibehalten wurden, wenn sich die Variable in der inneren Klasse ändert und später im umschließenden Bereich verwendet wird. Grundsätzlich bleibt das, was in der inneren Klasse passiert, in der inneren Klasse.
Ich habe hier eine ausführlichere Erklärung geschrieben . Außerdem wird erklärt, warum Instanz- und globale Variablen nicht als endgültig deklariert werden müssen.
quelle
Der Fehler sagt alles, ändern Sie:
zu
quelle
final
in Java. Zusammen mit dem Fehlen von Referenzparametern stellt diese Regel sicher, dass die Einheimischen nur in der Methode zugewiesen werden, zu der sie gehören. Code ist somit besser lesbar.addSiteButton.setOnClickListener(new View.OnClickListener() {
du eine Idee, warum das auftauchen würde?null
. Wahrscheinlich kehrt findViewById zurücknull
. Mehr kann ich nicht sagen, kein Android-Programmierer zu sein; Ich rate Ihnen, eine separate Frage zu stellen. Sicher hat es nichts mit inneren Klassen zu tun, final, et similia .Hier ist eine lustige Antwort.
Sie können ein endgültiges Array mit einem Element deklarieren und die Elemente des Arrays anscheinend beliebig ändern. Ich bin sicher, es bricht genau den Grund, warum diese Compiler-Regel überhaupt implementiert wurde, aber es ist praktisch, wenn Sie sich in einer Zeitbindung befinden, wie ich es heute war.
Ich kann eigentlich keinen Kredit für diesen beanspruchen. Es war die Empfehlung von IntelliJ! Fühlt sich ein bisschen hackig an. Aber es scheint nicht so schlimm wie eine globale Variable, deshalb dachte ich, dass es hier erwähnenswert ist. Es ist nur eine Lösung für das Problem. Nicht unbedingt der beste.
quelle
Wie @Veger sagte, können Sie es
final
so gestalten, dass die Variable in der inneren Klasse verwendet werden kann.Ich habe es
pager
eher genannt, alsmPager
weil Sie es als lokale Variable in deronCreate
Methode verwenden. Dasm
Präfix ist normalerweise für Klassenmitgliedervariablen reserviert (dh Variablen, die am Anfang der Klasse deklariert werden und allen Klassenmethoden zur Verfügung stehen).Wenn Sie tatsächlich eine Klassenmitgliedsvariable benötigen, funktioniert dies nicht, um sie endgültig zu machen, da Sie
findViewById
den Wert erst dann festlegen könnenonCreate
. Die Lösung besteht darin, keine anonyme innere Klasse zu verwenden. Auf diese Weise muss diemPager
Variable nicht als endgültig deklariert werden und kann in der gesamten Klasse verwendet werden.quelle
quelle