Android 动态添加的片段在屏幕旋转时再次添加

Android 动态添加的片段在屏幕旋转时再次添加,android,android-fragments,screen-orientation,android-framelayout,Android,Android Fragments,Screen Orientation,Android Framelayout,我想动态地将片段添加到布局中。但在屏幕旋转时,碎片会再次添加到上一个碎片的顶部 布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:baselineAligned="false" android

我想动态地将片段添加到布局中。但在屏幕旋转时,碎片会再次添加到上一个碎片的顶部

布局:

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

    <FrameLayout
        android:id="@+id/title_fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <FrameLayout
        android:id="@+id/quote_fragment_container"
        android:layout_width="0dp"
        android:layout_height="match_parent" />

</LinearLayout>


源代码来自:

这是因为每次旋转屏幕时,都会重新创建活动,即再次调用
onCreate()
。由于您是在
onCreate
中创建片段,因此每次都会创建一个新片段,而不会销毁前一个片段


为了解决这个问题,您可以使用
savedInstanceState
保存活动的状态,或者保存一个布尔值,表明片段已经创建过一次,然后在
onCreate
中检查是否创建片段。

这是因为每次旋转屏幕时,都会重新创建活动,即
onCreate()
将再次调用。由于您是在
onCreate
中创建片段,因此每次都会创建一个新片段,而不会销毁前一个片段


为了解决这个问题,您可以使用
savedInstanceState
保存活动的状态,或者保存一个布尔值,表明片段已经创建过一次,然后在
onCreate
中检查是否创建片段。

这是因为每次旋转屏幕时,都会重新创建活动,即
onCreate()
将再次调用。由于您是在
onCreate
中创建片段,因此每次都会创建一个新片段,而不会销毁前一个片段


为了解决这个问题,您可以使用
savedInstanceState
保存活动的状态,或者保存一个布尔值,表明片段已经创建过一次,然后在
onCreate
中检查是否创建片段。

这是因为每次旋转屏幕时,都会重新创建活动,即
onCreate()
将再次调用。由于您是在
onCreate
中创建片段,因此每次都会创建一个新片段,而不会销毁前一个片段


要解决此问题,您可以使用
savedInstanceState
保存活动状态,也可以保存一个布尔值,表明片段已创建一次,然后在
onCreate
中检查是否创建片段。

谢谢。对在
mFragmentManager.beginTransaction()之前添加
if(savedInstanceState==null){
解决了问题。我很高兴能提供帮助:)谢谢。是的。在
mFragmentManager.beginTransaction()之前添加
if(savedInstanceState==null){
解决了问题。我很高兴能帮上忙:)谢谢。是的。在
mFragmentManager.beginTransaction()之前添加
if(savedInstanceState==null){
解决了问题。
我很高兴能帮上忙:)谢谢。是的。在
mFragmentManager.beginTransaction()之前添加
if(savedInstanceState==null){/code>;
解决了这个问题。我很高兴能帮上忙:)
package course.examples.Fragments.DynamicLayout;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.util.Log;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import course.examples.Fragments.DynamicLayout.TitlesFragment.ListSelectionListener;

public class QuoteViewerActivity extends Activity implements
ListSelectionListener {

public static String[] mTitleArray;
public static String[] mQuoteArray;

private final QuotesFragment mQuoteFragment = new QuotesFragment();
private FragmentManager mFragmentManager;
private FrameLayout mTitleFrameLayout, mQuotesFrameLayout;

private static final int MATCH_PARENT = LinearLayout.LayoutParams.MATCH_PARENT;
private static final String TAG = "QuoteViewerActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {

Log.i(TAG, getClass().getSimpleName() + ":entered onCreate()");

super.onCreate(savedInstanceState);

mTitleArray = getResources().getStringArray(R.array.Titles);
mQuoteArray = getResources().getStringArray(R.array.Quotes);

setContentView(R.layout.main);

mTitleFrameLayout = (FrameLayout) findViewById(R.id.title_fragment_container);
mQuotesFrameLayout = (FrameLayout) findViewById(R.id.quote_fragment_container);

mFragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = mFragmentManager
.beginTransaction();
fragmentTransaction.add(R.id.title_fragment_container,
new TitlesFragment());
fragmentTransaction.commit();

mFragmentManager
.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
public void onBackStackChanged() {
setLayout();
}
});
}

private void setLayout() {
if (!mQuoteFragment.isAdded()) {
mTitleFrameLayout.setLayoutParams(new LinearLayout.LayoutParams(
MATCH_PARENT, MATCH_PARENT));
mQuotesFrameLayout.setLayoutParams(new LinearLayout.LayoutParams(0,
MATCH_PARENT));
} else {
mTitleFrameLayout.setLayoutParams(new LinearLayout.LayoutParams(0,
MATCH_PARENT, 1f));
mQuotesFrameLayout.setLayoutParams(new LinearLayout.LayoutParams(0,
MATCH_PARENT, 2f));
}
}

@Override
public void onListSelection(int index) {
if (!mQuoteFragment.isAdded()) {
FragmentTransaction fragmentTransaction = mFragmentManager
.beginTransaction();
fragmentTransaction.add(R.id.quote_fragment_container,
mQuoteFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
mFragmentManager.executePendingTransactions();
}
if (mQuoteFragment.getShownIndex() != index) {
mQuoteFragment.showIndex(index);
}
}

@Override
protected void onDestroy() {
Log.i(TAG, getClass().getSimpleName() + ":entered onDestroy()");
super.onDestroy();
}

@Override
protected void onPause() {
Log.i(TAG, getClass().getSimpleName() + ":entered onPause()");
super.onPause();
}

@Override
protected void onRestart() {
Log.i(TAG, getClass().getSimpleName() + ":entered onRestart()");
super.onRestart();
}

@Override
protected void onResume() {
Log.i(TAG, getClass().getSimpleName() + ":entered onResume()");
super.onResume();
}

@Override
protected void onStart() {
Log.i(TAG, getClass().getSimpleName() + ":entered onStart()");
super.onStart();
}

@Override
protected void onStop() {
Log.i(TAG, getClass().getSimpleName() + ":entered onStop()");
super.onStop();
}

}