фрагменты и обработка изменений ориентации - PullRequest
3 голосов
/ 13 декабря 2011

У меня есть активность с фрагментом.

Я бы сам хотел изменить ориентацию, поэтому я обновил манифест, чтобы он выглядел так:

    <activity android:name="com.test.app" android:configChanges="orientation|keyboardHidden"/>

Затем яобновил действие, чтобы оно выглядело так:

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        updateLayout();
    }

и

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        updateLayout();
    }

    private void updateLayout() {
        setContentView(R.layout.my_layout);
    }

Я также делаю это с фрагментом:

    fragment.setRetainInstance(true);

У меня проблема в том, чтокогда я делаю ориентацию экрана, происходит сбой в setContentView (), говоря о наличии дублированного идентификатора для моего фрагмента.Не знаете, как сделать так, чтобы этого не произошло - идеи?

tia.

1 Ответ

1 голос
/ 14 декабря 2011

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

Кроме того, я не уверен, но я думаю, что это:

fragment.setRetainInstance(true);

не нужно?Потому что здесь вы говорите, что НЕ следует воссоздавать вашу активность при изменениях конфигурации:

android:configChanges="orientation|keyboardHidden"

По моему опыту, настройки configChanges в XML достаточно для предотвращения воссоздания.

РЕДАКТИРОВАТЬ:

Мммм, просто смотрю еще раз, как именно вы используете фрагменты?Если код, размещенный здесь, взят из вашей FragmentActivity, то я бы ожидал чего-то подобного для надувания вашего фрагмента и добавления его в Activity:

class SomeActivity extends FragmentActivity
{
    ...
    @Override
    public void onCreate( Bundle savedInstance )
    {
    ...
        LayoutInflater inflater = getLayoutInflater();
        inflater.inflate( R.layout.some_fragment, root );
    ...
    }
}

, когда этот XML выглядит примерно так: some_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<fragment
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:name="com.someapp.fragments.SomeFragment">
</fragment>

Так что, думаю, мне не совсем понятно, как вы используете фрагменты.Но использование их таким образом, с настройкой конфигурации XML, успешно отключает воссоздание на ротации для меня.

...