Внутри OnClickListener я не могу получить доступ к большинству переменных «вне» области, например:
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);*/
}
});
в этом примере мне нужно получить PacketManager, но я не могу его получить, так как у меня нет контекста, доступного внутри OnClickListener.
Я мог бы сделать статическую ссылку снаружи и использовать ее внутри, но правильно ли это? Кажется странным делать это все время?
Cannot refer to a non-final variable table inside an inner class defined in a different method
? Я не могу получить к ним доступ черезMyActivity.this
.Activity.this.doStg()
. Не могли бы вы прикрепить сюда @LanceNanek какой-нибудь URL с более подробным объяснением, пожалуйста. Это как-то связано с реактивным программированием?Вы также можете реализовать интерфейс OnClickListener в своем классе и избежать необходимости в анонимном внутреннем классе. Затем вы должны установить прослушиватель щелчка следующим образом:
findViewById(R.id.Button01).setOnClickListener(this);
Если у вас есть несколько кнопок, использующих один слушатель, вы можете использовать оператор switch с view.getId () (который соответствует идентификатору представления в R.id), чтобы различать их.
источник
Вы можете сделать несколько вещей. Вы можете создать внутренний класс, который реализует onClickListener и передать необходимые аргументы в конструктор класса. Я все еще не считаю этот подход самым чистым. Обычно я просто создаю другой метод для выполнения своего действия. Итак, в onClick (View v) я бы сделал что-то вроде этого.
onClick(View v){doMyAction(myParams)} private void doMyAction(Object params){//do stuff}
И просто передайте необходимые параметры из метода слушателя в метод вне слушателя.
источник
Измените используемый конструктор Intent на Intent (context, classname) и используйте getApplicationContext () в своем внутреннем классе. Все равно решил мою проблему.
источник