Изменение ориентации (в configChanges) заставляет мои кнопки перестать работать после ориентации - PullRequest
0 голосов
/ 21 декабря 2011

У меня есть это аккуратное приложение ...

В onCreate он отображает файл "launchcreen.xml" соответственно:

        super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
    setContentView(R.layout.startscreen);
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
            R.layout.window_title);

И в моем приложении у меня есть "configChanges =" direction "" в манифесте. И у меня есть,

    @Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  setContentView(R.layout.startscreen);

}

startcreen.xml - это альбомная и портретная разметка, обе они разделены

Так что к проблеме, приложение загружается нормально, кнопки работают. Я переключаю ориентацию, кнопка перестает отвечать ...

Они оба используют RelativeLayout ...

Есть какие-нибудь подсказки? : S

EDIT:

Попробовал это сейчас благодаря вашим комментариям, но без результата: S

    @Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  setContentView(R.layout.startscreen);

    add_note.setOnClickListener(new View.OnClickListener() {
        public void onClick(final View v) {
            createNote();
        }

    });
}

Вы имеете в виду, что onclickListener или эти:

add_note = (Button) findViewById(R.id.addnote);

?? : S

Ответы [ 2 ]

4 голосов
/ 21 декабря 2011

Если вы добавляете прослушиватели кликов в onCreate к своим кнопкам, вам необходимо добавить прослушиватели для новых объектов кнопок, созданных в onConfigurationChanged.

Возможно, вы захотите использовать атрибут android:onClick вXML-файлы вместо установки прослушивателей кликов в коде.Это хороший способ избежать этой проблемы.

Чтобы использовать android:onClick из XML, сделайте что-то вроде этого:

<Button
    android:id="@+id/addnote"
    android:onClick="addNoteMethod"
    ....
    />

Затем в своей деятельности определите метод:

public void addNoteMethod(View view) {
    createNote();
}

Имя метода android:onClick совершенно произвольно;он просто должен сопоставить метод в вашей деятельности с правильной подписью (void <method_name>(View)).Метод будет вызываться, когда происходит щелчок точно так же, как метод onClick будет вызываться для OnClickListener.

. При использовании android:onClick вы делаете , а не нужно позвонить setOnClickListener (или даже получить ссылку на кнопку в onCreate, если она вам не нужна для чего-то другого).

0 голосов
/ 21 декабря 2011

Каждый раз, когда вы устанавливаетеContentView для нового идентификатора макета, вам нужно будет заново делать все, что вы обычно делаете в onCreate, например findViewById, и связывать click / любые другие события со всеми элементами управления.

Что вы делалинеправильно было то, что вы, вероятно, использовали более старую ссылку на кнопку, которую вы нашли в методе onCreate ViewById, в то время как этой кнопки больше нет на экране.На экране есть новая кнопка, которая была создана после того, как вы вызвали setContentView в событии onConfigurationChanged, поэтому вам, вероятно, нужно снова найти ViewById,

Примерно так:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.startscreen);

    add_note = (Button) findViewById(R.id.addnote);

    add_note.setOnClickListener(new View.OnClickListener() {
        public void onClick(final View v) {
            createNote();
        }
    });
}
...