0

Я хочу добавить фрагменты динамически в макет. но при вращении на экране фрагмент снова добавляется поверх предыдущего фрагмента.Динамически добавленные фрагменты снова добавляются на экране вращения

Image before any rotation

Image after rotation

макета:

<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> 

MainActivity:

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(); 
} 

} 

исходные коды из: https://github.com/aporter/coursera-android/tree/master/Examples/FragmentDynamicLayout

ответ

2

Это связано с тем, что каждый раз, когда вы поворачиваете экран, ваша деятельность воссоздана, т. Е. Снова вызывается onCreate(). Поскольку вы создаете фрагмент в onCreate, новый фрагмент создается каждый раз, а предыдущий не уничтожается.

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

+0

спасибо. да. добавление 'if (savedInstanceState == null) {' before 'mFragmentManager.beginTransaction();' решает проблему. –

+0

Я рад, что смог помочь :) –

Смежные вопросы