2012-12-08 13 views
7

ページャなしでフラグメントをナビゲートする適切な方法を見つけられず、画面の向きを変更する際に問題が発生します。私は、表示/非表示を使用してそれらを表示し、機能させるためにフラグメントに使用していますが、代わりにDetach/Attachを使用する必要があるかどうか疑問に思っています。私はまた、バックスタックに物事を追加する問題を抱えていると私はそれもショー/非表示の使用によると思う。アタッチ/デタッチを使用する方が良いですか?または、最後の/現在のフラグメントを表示/非表示にするために、戻るボタンがオーバーライドする方法がオーバーライドされていますか?フラグメントデタッチ/再接続Vs表示/非表示

動作: マップフラグメントとリストフラグメントがいくつかあります。すべてが正しく起動し、最初は向きが変わっています。リストビューにナビゲートすると、正しく挿入されますが、向きが変更されると、リストにはデータがなくなり、リストが再描画されます。マップビューも再描画され、私のページャータイトルインジケーターの後ろに表示されます。 もし誰かがこれを解決するための正しい方向に私を指してくれればそれはすばらしいでしょう。私はそれがフラグメントを表示して隠しているということが原因であると考えています。

ここで私はフラグメントを作成し、フラグメントマネージャに追加します。私はまた、フラグメントを表示/非表示する場所を示しました。

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_map_frags); 
    mapViewContainer = LayoutInflater.from(this) 
      .inflate(R.layout.map, null); 

    setupFragments(); 
    showFragment(0); 
} 
public void setListData(String name) { 
    bName = name; 
    showFragment(1); 
} 
private void setupFragments() { 
    final FragmentManager fm = getSupportFragmentManager(); 
    final FragmentTransaction ft = fm.beginTransaction(); 
    mFragment1 = fm.findFragmentByTag("f1"); 
    if (mFragment1 == null) { 
     mFragment1 = new MenuFragment(); 
     ft.add(mFragment1, "f1"); 
     ft.hide(mFragment1); 
    } 
    mMapFragment = (MapFragment) getSupportFragmentManager() 
      .findFragmentByTag(MapFragment.TAG); 
    if (mMapFragment == null) { 
     mMapFragment = MapFragment.newInstance(0); 
     ft.add(R.id.fragment_container, mMapFragment, MapFragment.TAG); 
    } 
    ft.hide(mMapFragment); 

    myListFragment = (ListFrag) getSupportFragmentManager() 
      .findFragmentByTag(ListFrag.TAG); 
    if (myListFragment == null) { 
     myListFragment = new ListFrag(); 
     ft.add(R.id.fragment_container, myListFragment, ListFrag.TAG); 
    } 
    ft.hide(myListFragment); 

    frag = (frag) getSupportFragmentManager().findFragmentByTag(
      frag.TAG); 
    if (frag == null) { 
     bacFrag = new frag(); 
     ft.add(R.id.fragment_container, frag, frag.TAG); 
    } 
    ft.hide(bacFrag); 
    ft.commit(); 
} 

public void showFragment(int fragIn) { 
    final FragmentTransaction ft = getSupportFragmentManager() 
      .beginTransaction(); 
    ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); 
    if (mVisible != null) { 
     if (mVisible == mListFragment) { 
      ft.remove(mListFragment); 
     } else { 
      ft.hide(mVisible); 
     } 
    } 

    switch (fragIn) { 
    case 0: 
     ft.show(mMapFragment); 
     ft.commit(); 
     mVisible = mMapFragment; 
     break; 
    case 1: 
     mListFragment = (ListFragmentDisplay) getSupportFragmentManager() 
       .findFragmentByTag(ListFragmentDisplay.TAG); 
     Toast.makeText(this, "startListFrag", Toast.LENGTH_LONG).show(); 
     if (mListFragment == null) { 
      mListFragment = new ListFragmentDisplay(); 
      ft.add(R.id.fragment_container, mListFragment, 
        ListFragmentDisplay.TAG); 
     } 
     ft.show(mListFragment).commit(); 
     mVisible = mListFragment; 
     break; 
    case 2: 
     ft.show(myfragment).commit(); 
     mVisible = myfragment; 
     break; 
    case 3: 
     ft.show(frag).commit(); 
     mVisible = frag; 
     break; 
    } 
} 
+0

オリエンテーションの変更を再開できないようにするには、マニフェストにandroid:configChanges = "orientation | keyboardHidden"を追加します。 – Faizan

+0

Detach/Attachはリソースを解放しますが、hide/showは解放しません。 – Faizan

答えて

4

あなたの責任ではありません。問題は、オリエンテーションが変更されるとすべてのアクティビティが破棄され、すべてのフラグメントが追加された場合でも問題になります。したがって、その中のどのデータも保持されません。 android:configChanges="orientation|keyboardHidden"を使用することはお勧めしません。 ではなく、すべてのフラグメントsetRetainInstance(true)に設定すると、現在のコードでうまく動作します。

+0

これは、1つの画面上の複数のフラグメントでは機能しません。しかし、私はあきらめていないし、すべてを別の方法で作り直して、上記の私の問題を解決していただろう。 – doubleA

+0

これはタイトルの質問には実際には答えていません。 – zgulser

0

より良い持続性(例えば、スペースの問題で活動が一時的に破壊されている場合など)を残したい場合は、フラグメントの状態をonSaveInstanceStateで保存することを忘れないでください。 setRetainInstanceは、設定変更が近づいているときにのみ機能します。