旋转设备后恢复数据的问题

时间:2015-09-23 06:38:37

标签: android android-fragments rotation

我在类似问题上检查了很多其他答案,但仍然无法理解那里有什么问题。

我有活动和片段

main_activity.xml

False

MainActivity.java

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:id="@+id/fragment_container"
        android:background="#CCC"/>

</LinearLayout>

简单片段

public class MainActivity extends Activity {

    private LinearLayout fragmentContainer;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("LOG", "onCreate");
        setContentView(R.layout.activity_main);
        if (savedInstanceState == null) {
            openFragment();
        } else {
            replaceFragment();
        }
    }

    private void openFragment() {
        final LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.HORIZONTAL);
        ll.setId(12345);
        getFragmentManager().beginTransaction().add(ll.getId(),
            new SimpleFragment(), "SimpleFragment").commit();

        fragmentContainer = (LinearLayout) findViewById(R.id.fragment_container);
        fragmentContainer.addView(ll);
    }

    private void replaceFragment() {
        final LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.HORIZONTAL);
        ll.setId(12345);
        getFragmentManager().beginTransaction().replace(ll.getId(),
            new SimpleFragment(), "SimpleFragment").commit();

        fragmentContainer = (LinearLayout) findViewById(R.id.fragment_container);
        fragmentContainer.addView(ll);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("LOG", "onDestroy");
    }
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Simple Fragment"/>

</LinearLayout>

那么问题是什么:

当我旋转设备应用程序应该保存状态然后恢复它(假设一些变量)。

旋转后立即执行 onSaveInstanceState 。 数据已保存。 然后执行片段 onCreate 并恢复数据。

多数民众赞成。它是预期的行为。

但是由于活动也被重新创建,因此应该再次添加(替换)片段。结果片段 onCreate 再次执行。我看到没有保存数据的片段。我看到新创建的片段。

如何避免这种创作?

我旋转设备,保存数据然后恢复。片段在恢复数据的活动上可见。

那么为活动添加片段的算法是什么,为了不在旋转后添加它并避免重新创建?

1 个答案:

答案 0 :(得分:0)

从布局添加

通常,您不需要为代码中的片段添加其他容器。添加片段的最简单方法是在布局中使用 <fragment .../> 属性定义android:id !!!

您的案例示例:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("LOG", "onCreate");
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("LOG", "onDestroy");
    }
}

main_activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
    >

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#CCC"
        android:orientation="vertical"
        >

        <fragment
            android:id="@+id/fragment"
            android:name="your.package.name.SimpleFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />
    </FrameLayout>

</LinearLayout>

片段代码和布局不需要任何更改。

从代码添加

如果您确实需要从代码中添加它,则不需要从代码中添加其他容器。如果首次启动,只需添加片段 - 系统将为您完成后。

您的案例示例:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("LOG", "onCreate");
        setContentView(R.layout.activity_main);
        if (savedInstanceState == null) {
            openFragment();
        }
    }

    private void openFragment() {
        getFragmentManager().beginTransaction().add(R.id.fragment_container,
                new SimpleFragment(), "SimpleFragment").commit();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("LOG", "onDestroy");
    }
}

main_activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:id="@+id/fragment_container"
        android:background="#CCC"/>

</LinearLayout>

片段代码和布局不需要任何更改。