Сохранить состояние фрагмента при изменении ориентации, но заменить его макет

У меня есть действие (которое является средством запуска приложения), в котором есть ViewPager в качестве меню навигации между вкладками. Внутри этого ViewPager у меня есть разные типы фрагментов.

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

Для конкретного фрагмента у меня есть 2 макета (один для портрета и один для ландшафта).

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

Я пробовал configChanges, но очевидно, что это не меняет мой макет. Я попытался раздуть макеты портретной и альбомной ориентации и заменить их внутри контейнера FrameLayout на onConfigurationChanged, но, похоже, это тоже не работает.

Как я могу справиться с ситуацией, когда мне нужно загрузить другой макет, сохраняя при этом состояние фрагмента нетронутым? Это вообще возможно? Каков правильный подход к такого рода вещам?


person Gilad Eshkoli    schedule 28.10.2015    source источник


Ответы (1)


У меня такая ситуация, чтобы загрузить другой макет при изменении ориентации экрана через метод setLayout;

public class SampleFragment extends Fragment{

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mRoot = inflater.inflate(R.layout.fragment_layout, null);
    return mRoot;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    this.init();
}

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

private void init() {
    this.setLayout();
}

private void setLayout() {
    View view = null;
    int orientation = mResources.getConfiguration().orientation;
    if (orientation == Configuration.ORIENTATION_LANDSCAPE)
        view = mInflater.inflate(R.layout.segment_dettaglio_evento_land, null);
    else if (orientation == Configuration.ORIENTATION_PORTRAIT)
        view = mInflater.inflate(R.layout.segment_dettaglio_evento, null);

    if (orientation == Configuration.ORIENTATION_LANDSCAPE || orientation == Configuration.ORIENTATION_PORTRAIT) {
        ViewGroup viewGroup = (ViewGroup) mRoot.findViewById(R.id.dettaglio_evento_root);
        viewGroup.removeAllViews();
        viewGroup.addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        this.initComponent();
    }
}

private void initComponent() {
 if (mResult == null)
        retrieveData();
    else
        populateWithDetail();
}

}

fragment_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/dettaglio_evento_root"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@color/dettaglio_evento_background"
  android:orientation="vertical" >
</LinearLayout>

У меня также есть переменная mResult, которая содержит данные, сохраненные из сетевого запроса, поэтому, если она равна нулю, я делаю запрос, в противном случае заполняю представления.

person roccocullo    schedule 28.10.2015
comment
Большое спасибо ! Вы сэкономили мне уйму времени на поиски. Если бы я мог, я бы дал вам +100. - person Gilad Eshkoli; 28.10.2015