0

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

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

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

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

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

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

ответ

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, который содержит данные хранятся от запроса к сети, так что если это пустой я сделать запрос, заполнять представления иначе.

+0

Большое спасибо! Вы спасли меня много времени, ища это. Если бы я мог дать вам +100. – Gil