Innerhalb eines OnClickListener kann ich nicht auf die meisten Variablen "außerhalb" des Bereichs zugreifen, wie folgt:
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);*/
}
});
In diesem Beispiel muss der PacketManager abgerufen werden, und ich kann ihn nicht abrufen, da der Kontext im OnClickListener nicht verfügbar ist.
Ich könnte außen eine statische Referenz erstellen und innen verwenden, aber ist das richtig? Scheint seltsam, das die ganze Zeit tun zu müssen?
Cannot refer to a non-final variable table inside an inner class defined in a different method
? Ich kann nicht über auf diese zugreifenMyActivity.this
.Activity.this.doStg()
. Kannst du hier @LanceNanek eine URL mit detaillierterer Erklärung anfordern? Hat es etwas mit reaktiver Programmierung zu tun?Sie können auch die OnClickListener-Schnittstelle in Ihrer Klasse implementieren und die Notwendigkeit einer anonymen inneren Klasse vermeiden. Dann würden Sie den On-Click-Listener folgendermaßen einstellen:
findViewById(R.id.Button01).setOnClickListener(this);
Wenn Sie mehrere Schaltflächen mit einem Listener haben, können Sie eine switch-Anweisung mit view.getId () (die der ID der Ansicht in R.id entspricht) verwenden, um zwischen ihnen zu unterscheiden.
quelle
Sie können einige Dinge tun: Sie können eine innere Klasse erstellen, die den onClickListener implementiert, und die erforderlichen Argumente an den Konstruktor der Klasse übergeben. Ich finde das immer noch nicht den saubersten Ansatz. Normalerweise erstelle ich einfach eine andere Methode, um meine Aktion auszuführen. In onClick (View v) würde ich so etwas tun.
onClick(View v){doMyAction(myParams)} private void doMyAction(Object params){//do stuff}
Und übergeben Sie einfach die erforderlichen Parameter von der Listener-Methode an die Methode außerhalb des Listeners.
quelle
Ändern Sie den verwendeten Intent-Konstruktor in Intent (Kontext, Klassenname) und verwenden Sie getApplicationContext () in Ihrer inneren Klasse. Mein Problem trotzdem gelöst.
quelle