2013-02-22 16 views
30

私はMainActivityにListFragmentを持っています。ここで私のフラグメントオブジェクトを設定する方法です。スタックの先頭からフラグメントを取得する方法はありますか?

FragmentManager fragmentManager = activity.getSupportFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
Fragment newFragment = new MyFragment(); 
fragmentTransaction.replace(R.id.framecontainer, newFragment, "tag"); 
fragmentTransaction.addToBackStack(null); 
fragmentTransaction.commit(); 

問題は、ユーザーの背中を押しボタンが、私は、少なくとも、

getActionBar().setTitle(title); 
getActionBar().setDisplayHomeAsUpEnabled(isEnabled); 
invalidateOptionsMenu(); 

を呼び出すことによりアクションバーとメニューを変更する必要があるとき、私は現在表示された断片の種類を知っている必要があります私はアクションバーを設定する方法を知っています。私は引数としてフラグメントに設定オプションを格納します。

String title = fragment.getArguments().getString("KEY_TITLE"); 
boolean isEnabled = fragment.getArguments().getBoolean("KEY_ISENABLED"); 

私は、関連する質問を検索しません、と私は、私はカスタムスタック内のすべてのタグを格納し、そして(ポップを呼び出す必要があり、私はしかし

MyFragment fragment = (MyFragment) getSupportFragmentManager() 
     .findFragmentByTag("tag"); 

を呼び出すことによって、フラグメントを得ることができる実現)onBackPressed()でユーザが戻るボタンを押すたびに。

私の質問は、は、スタックから現在の表示可能なフラグメントを直接取得する方法はありますか?

注:フラグメントタイプは、MyFragmentだけでなく、異なることにご注意ください。このようないくつかの事はbackpressにあなたの活動のフィギュアこれを助けるべきである

答えて

52

private Fragment getCurrentFragment(){ 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    String fragmentTag = fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName(); 
    Fragment currentFragment = fragmentManager.findFragmentByTag(fragmentTag); 
    return currentFragment; 
} 

@Override 
public void onBackPressed() { 
    Fragment fragmentBeforeBackPress = getCurrentFragment(); 
    // Perform the usual back action 
    super.onBackPressed(); 
    Fragment fragmentAfterBackPress = getCurrentFragment(); 
} 

は、この情報がお役に立てば幸いです。

+6

それは私があなたの方法でそれを行うならば、私は設定する必要があることと思われます* * fragmentTransaction.addToBackStack(タグ)**も同様です。それ以外の場合は、NullPointerExceptionが発生します。したがって、** fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName(); **はタグ名を参照していません –

+1

はい...ヌルと悪い数学((getBackStackEntryCount-1)> 0など)。私はちょっとこれをあまりにも速く書きました。また、タグなしで追加されたフラグはnullとして表示されます。 – petey

+0

addToBackStack(null)を使用してもまだ動作しますか? – umerk44

20
FragmentManager.findFragmentById(fragmentsContainerId) 

function戻りbackstackでFragmentトップにリンクします。使用例:

fragmentManager.addOnBackStackChangedListener(new OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      Fragment fr = fragmentManager.findFragmentById(R.id.fragmentsContainer); 
      if(fr!=null){ 
       Log.e("fragment=", f.getClass().getSimpleName()); 
      } 
     } 
    }); 
+0

これは奇妙なようです...しかし、私のために素晴らしい仕事:)。ドキュメントではバックスタックを検索していると言われていますので、常にAndroidのすべてのバージョン(指が交差している)のスタックの上部から検索してください。 – delrocco

+0

私はこれほど長い間これを探し続けてきました。このリスナーの仕組みを整理してくれてありがとう – mikebertiean

1

答えが正しいものとしてマークされ、私の追加情報の はそれにその異なることはありませんすでにあります。しかし、受信機を使用しているときに問題が発生しました 受信側のフラグメントが現在のトップ フラグメントであるかどうかを判断してください。 NPEとインデックスの範囲外で多くのことを簡単に実行できます。 したがって、私はこれを書いた、おそらく誰かを助ける。

private boolean isFragmentOnTop(Activity parentActivity, final String fragmentName){ 
     FragmentManager fmManager = parentActivity.getFragmentManager(); 
     if(fmManager.getBackStackEntryCount() == 0){ 
      LOG.i("BackStack entry count is 0: " + this); 
      return false; 
     } 
     String fragmentNameOnStackTop = ""; 
     final FragmentManager.BackStackEntry topEntry = fmManager.getBackStackEntryAt(fmManager.getBackStackEntryCount() -1); 
     if(topEntry != null) { 
      fragmentNameOnStackTop = topEntry.getName(); 
     } 
     LOG.d("Got fragments name: " + fragmentNameOnStackTop); 
     return fragmentNameOnStackTop != null ? fragmentNameOnStackTop.equals(fragmentName) : false; 
    } 

これは、いくつかのフラグメントを持つアクティビティではうまく動作することに注意してください。 ViewPagerとchildfragmentmanagerを使用している場合は であることに注意してください。

そして、このヘルパーメソッドはスタックの先頭からの断片を取得しFragmentTransaction.addToBackStack(fragmentName)

0

にfragmentNameを設定することを忘れないでください:

public Fragment getTopFragment() { 
    if (getSupportFragmentManager().getBackStackEntryCount() == 0) { 
     return null; 
    } 
    String fragmentTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName(); 
    return getSupportFragmentManager().findFragmentByTag(fragmentTag); 
} 
関連する問題