Другой фрагмент не загружался при изменении ориентации (Android)

Я создал тестовый проект, в котором два разных фрагмента должны отображаться в одном и том же действии. Один фрагмент для пейзажа, а другой для портрета.

# My unique activity
public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

# First Fragment
public class LandscapeFragment extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        TextView v = (TextView) inflater.inflate(R.layout.fragment, container, false);
        v.setText("LANDSCAPE");
        return v;
    }
}

# Other Fragment
public class PortraitFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        TextView v = (TextView) inflater.inflate(R.layout.fragment, container, false);
        v.setText("PORTRAIT");
        return v;
    }
}

И у меня есть два файла main.xml, один в layout/, а другой в layout-land/. Каждый файл main.xml указывает на правильный используемый фрагмент.

<!-- layout-land/main.xml  -->
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment"
    android:name="br.luckcheese.test.LandscapeFragment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="5dp" />

<!-- layout/main.xml  -->
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment"
    android:name="br.luckcheese.test.PortraitFragment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="5dp" />

<!-- layout/fragment.xml  -->
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="30sp" />

Когда я открываю приложение в альбомной ориентации, отображается LandscapeFragment, а когда я открываю в портретном режиме, отображается PortraitFragment. Все идет нормально.

Но если я открою альбомную ориентацию и поверну устройство в портретную, тогда LandscapeFragment будет перезагружен и показан. Что не является прогнозируемым поведением. PortraitFragment должен быть загружен.

И то же самое происходит наоборот, если устройство запускается в портретной ориентации, а затем я поворачиваю его в альбомную: PortraitFragment просто перезагружается, вместо того, чтобы загрузить LandscapeFragment.

Что я делаю не так?


person Luckcheese    schedule 05.04.2012    source источник


Ответы (2)


Убедитесь, что у вас нет: android:config="orientation" в файле manifest.xml.

person Nhat Nam NGUYEN    schedule 06.04.2012
comment
Нет, уникальная строка, которую я добавил в манифест по умолчанию, — это «android: screenOrientation = датчик» для активности. - person Luckcheese; 08.04.2012
comment
Вы пытаетесь сделать точку останова в onCreate() своей деятельности, чтобы увидеть, вызывается ли этот метод при повороте устройства? - person Nhat Nam NGUYEN; 09.04.2012
comment
Да. Это называется. Я добавил сообщения журнала onCreate для своей активности и для каждого фрагмента. И когда я поворачиваю устройство, onCreate неправильного фрагмента вызывается после onCreate активности. - person Luckcheese; 09.04.2012

Проблема в ваших двух макетах, идентификаторы фрагментов одинаковы. Просто измените эти идентификаторы фрагментов, например:

фрагмент портрета для layout/main.xml

фрагментный ландшафт для layout-land/main.xml. (И также измените: Fragment frag = getSupportFragmentManager().findFragmentById(R.id.fragment);

frag.setRetainInstance(false); )

person Nhat Nam NGUYEN    schedule 11.04.2012
comment
Хорошо, тот рабочий. Но я не понял, зачем нужно добавлять разные идентификаторы? Потому что в моем коде я должен проверить оба, чтобы установить frag.setRetainInstance(false). Но я также выполняю работу по созданию уникального макета с помощью FrameLayout и добавляю фрагменты по коду после проверки текущей ориентации с помощью getResource().getConfiguration().orientation! - person Luckcheese; 21.04.2012