2012-06-22 8 views
14

私は1つのアクティビティマルチフラグメントアプリケーションを構築しています。すべてのトランザクション後にバックスタックに追加します。いくつかの隠れている断片を見せてから、電話機を回転させると、コンテナに追加されたすべての断片が復元され、すべての断片が別の断片の上に表示されます。隠されたバックスタックフラグメントが構成変更に再表示される

何が問題なのですか?私の活動で、以前隠されていた断片が表示されるのはなぜですか?

私は今まで隠されていたすべての断片を隠すことを考えていますが、これを行うにはもっと優雅な方法がありますか?

+0

ただ、注意する、隠された断片は、すでになど目に見えない容器に保管されています。したがって、すでに設定されている設定を変更すると、再び表示される可能性があります。 – zgulser

答えて

0

非表示にする代わりにreplace()関数を使用すると便利です。 Fragmentsを使用し始めたときに同じ問題が発生し、replace関数を使用すると、実際にFragmentsをよりうまく管理するのに役立ちました。ここに簡単な例があります:

9

各フラグメントにsetRetainInstance(true)を使用すると、問題は消えます。
警告:これをtrueに設定すると、フラグメントのライフサイクルが変更されます。
setRetainInstance(true)は問題を解決しますが、使用しない場合があります。 フラグメントのブール属性をその、セットアップを修正し、可視性、復元するには、次の構成変更(例えば画面の向き)いったん

private boolean mVisible = true; 
@Override 
public void onCreate(Bundle _savedInstanceState) { 
    super.onCreate(_savedInstanceState); 
    if (_savedInstanceState!=null) { 
     mVisible = _savedInstanceState.getBoolean("mVisible"); 
    } 
    if (!mVisible) { 
     getFragmentManager().beginTransaction().hide(this).commit(); 
    } 
    // Hey! no setRetainInstance(true) used here. 
} 
@Override 
public void onHiddenChanged(boolean _hidden) { 
    super.onHiddenChanged(_hidden); 
    mVisible = !_hidden; 
} 
@Override 
public void onSaveInstanceState(Bundle _outState) { 
    super.onSaveInstanceState(_outState); 
    if (_outState!=null) { 
     _outState.putBoolean("mVisible", mVisible); 
    } 
} 

を、インスタンスが破棄されますが、バンドルに保存され、注入されます新しいFragmentインスタンス。

2

私は同じ問題を抱えていました。アクティビティのonCreateView()関数でソースコードをチェックする必要があります。

public class MainActivity extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    setContentView(R.layout.activity_main); 

    if(savedInstanceState == null){//for the first time 

     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

     FragmentExample fragment = new FragmentExample(); 
     fragmentTransaction.add(R.id.layout_main, fragment); 
     fragmentTransaction.commit(); 

    }else{//savedInstanceState != null 
     //for configuration change or Activity UI is destroyed by OS to get memory 
     //no need to add Fragment to container view R.id.layout_main again 
     //because FragmentManager supported add the existed Fragment to R.id.layout_main if R.id.layout_main is existed. 
     //here is one different between Fragment and View 

    } 
} 

activity_main.xml:

<RelativeLayout 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" 
android:id="@+id/layout_main"> 

関連する問題