Добавление слушателя в onStart против onCreate

Я пытаюсь реализовать прослушиватель кнопок и смогу, если сделаю это в методе onStart. Когда я вместо этого инициализирую в onCreate (что, как я читал, является хорошей практикой), я получаю сообщение об ошибке «Не удалось обновить TargetChangeListener», и приложение аварийно завершает работу. Вот основная деятельность:

public class EventExampleActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_event_example);

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();

    }
    initListeners();
}

protected void onStart() {
    super.onStart();
}

private void initListeners() {
    Button myButton = (Button) findViewById(R.id.button1);


    myButton.setOnClickListener(
        new Button.OnClickListener() {

            @Override
            public void onClick(View v) {
                TextView myTextView = (TextView) findViewById(R.id.textView1);
                myTextView.setText("Button Pressed!");              
            }

    });
}
...
...
}

если это поможет, я следую этому руководству: http://www.techotopia.com/index.php/An_Overview_and_Example_of_Android_Event_Handling

Спасибо за любое понимание!


person Tom McFarlin    schedule 26.08.2014    source источник
comment
Есть ли у Button интерфейс onClickListener? Я знаю только View.onClickListener   -  person suitianshi    schedule 26.08.2014
comment
@suitianshi Сначала я тоже был удивлен, но когда я попробовал, это на самом деле относится к View.OnClickListener (потому что Button extends View), поэтому я не думаю, что проблема в этом.   -  person Andrew T.    schedule 26.08.2014
comment
Ваша кнопка во фрагменте или в активности?   -  person Tim Malseed    schedule 26.08.2014


Ответы (1)


Я предполагаю, что mybutton находится в вашем Fragment, а не в вашем Activity.

Если это так, то myButton, возможно, будет null при вызове initListeners(), потому что представление еще не обязательно создано.

Не гарантируется, что фрагменты будут доступны, как только вы вызовете beginTransaction()...commit(), поэтому это может объяснить, почему вы не можете сразу установить свой слушатель. Однако к тому времени, когда вы доберетесь до onStart(), ваш Fragment будет создан, и ваша кнопка не будет нулевой.

Либо продолжайте использовать прослушиватель в onStart(), либо установите его из своего Fragment, после того как ваше представление было раздуто в методе onCreateView(), или где-нибудь после этого в Fragment Lifecycle (вероятно, onActivitycreated() будет лучшим местом).

person Tim Malseed    schedule 26.08.2014