Wewnątrz OnClickListener nie mogę uzyskać dostępu do większości zmiennych „poza” zakresem, na przykład:
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);*/
}
});
w tym przykładzie muszę pobrać PacketManager i nie mogę go pobrać, ponieważ nie mam dostępnego kontekstu wewnątrz OnClickListener.
Mógłbym stworzyć statyczne odniesienie na zewnątrz i użyć go w środku, ale czy to prawda? Wydaje się dziwne, że trzeba to robić przez cały czas?
Cannot refer to a non-final variable table inside an inner class defined in a different method
? Nie mogę uzyskać do nich dostępu przezMyActivity.this
.Activity.this.doStg()
. Czy możesz załączyć tutaj @LanceNanek jakiś adres URL z bardziej szczegółowym wyjaśnieniem. Czy jest to w jakiś sposób związane z programowaniem reaktywnym?Możesz również zaimplementować interfejs OnClickListener w swojej klasie i uniknąć potrzeby anonimowej klasy wewnętrznej. Następnie należy ustawić odbiornik po kliknięciu w następujący sposób:
findViewById(R.id.Button01).setOnClickListener(this);
Jeśli masz wiele przycisków korzystających z jednego nasłuchiwania, możesz użyć instrukcji switch z view.getId () (co odpowiada identyfikatorowi widoku w R.id), aby je rozróżnić.
źródło
Jest kilka rzeczy, które możesz zrobić, możesz stworzyć wewnętrzną klasę, która implementuje onClickListener i przekazać niezbędne argumenty do konstruktora klasy. Nadal nie uważam tego za najczystsze podejście. Zwykle po prostu tworzę inną metodę wykonania mojej akcji. Więc w onClick (View v) zrobiłbym coś takiego.
onClick(View v){doMyAction(myParams)} private void doMyAction(Object params){//do stuff}
I po prostu przekaż potrzebne parametry z metody detektora do metody poza detektorem.
źródło
Zmień używany konstruktor Intent na Intent (kontekst, nazwa klasy) i użyj metody getApplicationContext () w Twojej innerclass. I tak rozwiązałem mój problem.
źródło