Внутри OnClickListener я не могу получить доступ ко многим вещам - как подойти? - PullRequest
75 голосов
/ 16 января 2010

Внутри 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.

Я мог бы сделать статическую ссылку снаружи и использовать ее внутри, но так ли это? Кажется странным, чтобы делать это все время?

Ответы [ 4 ]

223 голосов
/ 16 января 2010

Замените this в своем коде на MyActivity.this, где MyActivity - это имя класса вашего подкласса Activity.

Объяснение: Вы создаете анонимный внутренний класс при использовании этой части своего кода:
new OnClickListener() {
Анонимные внутренние классы имеют ссылку на экземпляр класса, в котором они созданы. похоже, что вы создаете его внутри подкласса Activity, потому что findViewById является методом Activity. Действия являются контекстом, поэтому все, что вам нужно сделать, это использовать ссылку на них, которая у вас есть автоматически.

9 голосов
/ 16 января 2010

Вы также можете реализовать интерфейс OnClickListener в своем классе и избежать необходимости в анонимном внутреннем классе. Тогда вы бы установили прослушиватель по нажатию так:

findViewById(R.id.Button01).setOnClickListener(this);

Если у вас несколько кнопок, использующих один слушатель, вы можете использовать оператор switch с view.getId () (который соответствует идентификатору представления в R.id), чтобы различать их.

3 голосов
/ 16 января 2010

Есть несколько вещей, которые вы можете сделать, вы можете создать внутренний класс, который реализует onClickListener и передать необходимые аргументы в конструктор класса. Я до сих пор не считаю, что самый чистый подход. Я обычно просто создаю другой метод для выполнения своих действий. Так что в onClick (View v) я бы сделал что-то вроде этого.

onClick(View v){doMyAction(myParams)}

private void doMyAction(Object params){//do stuff}

И просто передайте необходимые параметры из метода слушателя в метод вне слушателя.

0 голосов
/ 14 декабря 2015

Измените используемый конструктор Intent на Intent (context, classname) и используйте getApplicationContext () во внутреннем классе Все равно решил мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...