我在类似问题上检查了很多其他答案,但仍然无法理解那里有什么问题。
我有活动和片段
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 再次执行。我看到没有保存数据的片段。我看到新创建的片段。
如何避免这种创作?
我旋转设备,保存数据然后恢复。片段在恢复数据的活动上可见。
那么为活动添加片段的算法是什么,为了不在旋转后添加它并避免重新创建?
答案 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>
片段代码和布局不需要任何更改。