Запуск действия Android из прослушивателя, определенного во внешнем файле класса - PullRequest
2 голосов
/ 03 марта 2011

У меня есть активность MyActivity с кнопкой MyButton.

Я хочу прикрепить MySpecialOnClickListener к MyButton.

Я пишу MySpecialOnClickListener во внешний файл класса.

public class MySpecialOnClickListener extends ButtonHandler implements OnClickListener {
    public OnClickListenerWithSpeech (Context context) 
       { super.context = context; }

    @Override
    public void onClick(View view) {  handleClick(view);  }
}

и ButtonHandler выглядит так

public abstract class ButtonHandler {

    protected Context context;

    protected void handleClick (View view){
        if (view.getid()==R.id.button_B) {
            context.startActivity (new Intent(context, ActivityC.class));
        }
    }
}

Я хочу сохранить всю логику для кнопок в ButtonHandler.

ТАК ... как я уже сказал, у меня есть MySpecialOnClickListener, определенный во внешнем файле класса.

Когда я нажимаю MyButton, я получаю следующую фатальную ошибку.

Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

Так что я не могу нормально начать деятельность из неактивности. Достаточно справедливо.

Однако, если я изменю MySpecialOnClickListener на внутренний класс в «MyActivity», он будет работать нормально. Помните, что ButtonHandler по-прежнему является файлом внешнего класса. Так что это (откуда в конечном итоге ActivityC) не меняется.

Мой вопрос (наконец-то): может ли кто-нибудь объяснить логику того, почему одно разрешено, а другое нет. Я предполагаю, что это предмет или что-то в этом роде, но я немного запутался. Кажется, что код для запуска процесса запуска действия должен буквально находиться внутри другого действия.

РЕДАКТИРОВАТЬ - РЕШЕНИЕ ПРОБЛЕМЫ

см. Ниже. Расположение класса не имеет значения. Я просто не прошел в контексте правильно.

Ответы [ 3 ]

1 голос
/ 03 марта 2011

, поскольку поле контекста ButtonHandler не связано ни с каким контекстом активности.Поэтому, когда вы присоединяете экземпляр MySpecialOnClickListener к кнопке, вы создаете его, передавая параметр контекста, а не

что-то вроде этого:

MySpecialOnClickListener listener = new MySpecialOnClickListener(MyActivity.this);
aButton.setOnClickListener( listener );

таким образом, выконструирование кнопки с правильным контекстом ...

0 голосов
/ 03 марта 2011

Извинения тем из вас, кто пытался ответить.Это была моя ошибка (и я изначально не включал следующую информацию для людей)

Когда я передавал в контексте MySpecialOnClickListener, я делал:

view.setOnClickListener(new MySpecialOnClickListener(getApplicationContext()));

, когдаЯ должен был сделать:

view.setOnClickListener(new MySpecialOnClickListener(this));

Так что getApplicationContext(), похоже, не получает "правильный" контекст для приложения.

Что приводит меня к моему следующему вопросу относительно того, что getApplicationContext() фактически возвращает:)

0 голосов
/ 03 марта 2011

Вероятно, вы не передаете контекст Activity в MySpecialOnClickListener. Не могли бы вы показать мне разницу в том, как вы применяете метод внутреннего класса?

...