保持片段在方向上的状态更改但替换其布局

时间:2015-10-28 14:16:11

标签: android android-fragments screen-orientation android-configchanges

我有一个Activity(它是应用程序的启动器),它有一个ViewPager作为选项卡之间的导航菜单。 在这个ViewPager中,我有不同类型的片段。

目前,我自己没有处理方向更改,因此在我旋转设备时重新创建活动。 (表现得相当不错,但由于加载时间长,用户体验不好,我没有考虑再次加载整个活动。)

对于特定片段,我有2种布局(一种用于纵向,一种用于横向)。

我需要的是保持活动和片段的状态,但是在方向改变时替换片段布局。我的问题是它在横向布局中有比在肖像中更多的视图所以我不知道如何处理它。

我已尝试过configChanges,但显然它并没有改变我的布局。 我尝试对肖像和横向布局进行充气,并在onConfigurationChanged上的FrameLayout容器内替换它们,但它似乎也没有用。

如何处理我需要加载不同布局同时保持片段状态不变的情况?这甚至可能吗? 这种事情的正确方法是什么?

1 个答案:

答案 0 :(得分: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 ,其中包含从网络请求中保留的数据,因此如果它为null我发出请求,则填充视图。