0

私は次のコードを持っている:フラグメント重複の問題を回避するにはどうすればよいですか?

private List<WeakReference<Fragment>> mFragList = new ArrayList<WeakReference<Fragment>>(); 

@Override 
public void onAttachFragment (Fragment fragment) { 
    mFragList.add(new WeakReference(fragment)); 
} 

public List<Fragment> getActiveFragments() { 
    ArrayList<Fragment> ret = new ArrayList<Fragment>(); 
    for(WeakReference<Fragment> ref : mFragList) { 
     Fragment f = ref.get(); 
     if(f != null) { 
      if(f.isVisible()) { 
       ret.add(f); 
      } 
     } 
    } 
    return ret; 
} 

public Fragment findFragement(String tClass) { 

    List<Fragment> fragments = getActiveFragments(); 
    for (Fragment fragment : fragments) { 
     if (tClass.equalsIgnoreCase("Home")) { 
      if (fragment instanceof ToggleFragment) { 
       return fragment; 

      } 
     } else if (tClass.equalsIgnoreCase("Contacts")) { 
      if (fragment instanceof ContactFragment) { 
       return fragment; 
      } 
     } 
    } 
    return null; 
} 

コードが正常に動作しますが、私は懸念を持って、考えていない、このコード:

@Override 
public void onAttachFragment (Fragment fragment) { 
    mFragList.add(new WeakReference(fragment)); 
} 

原因画面が再作成された重複またはft.replaceを() 使用されている?

もっと良い方法がありますか?多くのコードを置き換えることなく、またはgetsupportfragmentmanager.getfragments()を使用せずに?

ありがとうございます!

答えて

1

重複がないことを保証する1つの方法は、マップを使用することです。あなたは、あなたが

Map<String, WeakReference<Fragment>> fragmentMap = new HashMap<>(); 

を使用して、マップにフラグメントを追加することができます代わりにArrayListを使用しての、

private static final String TAG = "MyFragmentClassName"; 

次に、あなたのクラスの先頭に次の行を追加することができ

map.put(TAG, myWeakReferenceInstance); 

アイテムを追加する場合は、チェックしてその場所に何かがあるかどうかを確認することができます

if (map.get(TAG) != null) { 
    //do something 
} 

これはうまくいくはずですが、まだgetSupportFragmentManager()を使用することをおすすめします。あなたはこれ以上のことをすべてそれで行うことができます。

private void showAlbumListFragment() { 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    albumListFragment = (AlbumListFragment) fragmentManager.findFragmentByTag(AlbumListFragment.TAG); 
    if (albumListFragment == null) { 
     albumListFragment = new AlbumListFragment(); 
    } 
    fragmentManager.beginTransaction() 
      .replace(R.id.fragment_container, albumListFragment, AlbumListFragment.TAG) 
      .commit(); 
    } 
+0

:あなたは、わずか数行を追加することができ、

private void showAlbumListFragment() { FragmentManager fragmentManager = getSupportFragmentManager(); albumListFragment = new AlbumListFragment(); fragmentManager.beginTransaction() .replace(R.id.fragment_container, albumListFragment, AlbumListFragment.TAG) .commit(); } 

あなたは重複を避けたい場合:たとえば、これは私が構築してきたこの音楽アプリで使用してきたいくつかのコードです私は複製が起こらないように他の方法はありませんか?可能であれば、私のコードに関して説明することができますが、理解しやすくなります。 hashmap –

+0

私がfragmentManagerを使わないと考えることができる最も簡単な方法は、フラグメントのすべてのインスタンスに対して一定であり、あらゆるタイプのフラグメントに対して異なる独自の属性(おそらくString)を作ることです(私は私の "TAG")。次に、ArrayListを繰り返し処理して、そこに配置しようとしているフラグメントのTAGを持つフラグメントがあるかどうかを確認し、そうであれば置換します。 – evanklicker

+1

fragmentManagerを使用できない特別な理由はありますか?これはまさに彼らが扱うように設計されたものです。 – evanklicker

関連する問題