2011-09-16 20 views
23

私はViewPagerをFragmentPagerAdapterと共に使用して3つの異なるフラグメントをホストしています。ViewPager内でフラグメントを別のフラグメントに置き換える

[Fragment1][Fragment2][Fragment3] 

私が達成しようとしているのは、特定のタスクが成功するとFragment1を完全に新しいフラグメントFragment4に置き換えることです。

FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 
transaction.replace(R.id.fragment1_layout_id, fragment4); 
transaction.commit(); 

..フラグメントが美しく置き換えられ、フラグメント1の代わりにフラグメント4が表示されます。私はFragment3までスワイプしてからFragment4に戻ってすぐに、Fragment1が復活しました。

また、私が使用する場合..

FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 
transaction.remove(fragment1); 
transaction.commit(); 

..フラグメント1が削除され、私が戻ってくると、フラグメント4があります。だからこのソリューションの問題は、たとえ私が試しても、Fragment1が削除されてもすぐにFragment4を表示する方法が見つからないことです。を管理するトランザクション:

public static class PagerAdapter extends FragmentPagerAdapter { 

    public PagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public int getCount() { 
     return VIEW_COUNT; 
    } 

    @Override 
    public Fragment getItem(int position) { 

     Fragment fragment = null; 

     switch (position) { 
     case 0: 
      fragment = Fragment1.newInstance(context_); 
      break; 

     case 1: 
      fragment = Fragment2.newInstance(context_); 
      break; 

     case 2: 
      fragment = Fragment3.newInstance(context_); 
      break; 

     default: 
      break; 
     } 

     return fragment; 
    } 
} 

編集。

だから私は私の質問で完全にはっきりしていなかったようです。私は先に作成したスパゲッティをすべて取り除き、私がオフにしてしまったと述べました(上記太字のテキストを参照)。

とにかくここではgetItem()内で何をしようとしていたのですか?

@Override 
public Fragment getItem(int position) { 

    Fragment fragment = null; 

    switch (position) { 
    case 0: 

     if (!app.isUserLoggedIn) { 
      if (loginFragment_ == null) { 
       loginFragment_ = LoginFragment.newInstance(context_); 
       transaction_ = fragmentManager_.beginTransaction(); 

       if (logoutFragment_ != null) { 
        transaction_.remove(logoutFragment_); 
        logoutFragment_ = null; 
       } 

       transaction_.add(loginFragment_, "login"); 
       transaction_.commit(); 
      } 

      if (fragmentManager_.findFragmentByTag("login") == null) 
       fragment = LoginFragment.newInstance(context_); 
      else 
       fragment = fragmentManager_.findFragmentByTag("login"); 

     } else { 
      if (logoutFragment_ == null) {      
       logoutFragment_ = LogoutFragment.newInstance(context_); 
       transaction_ = fragmentManager_.beginTransaction(); 

       if (loginFragment_ != null) { 
        transaction_.remove(loginFragment_); 
        loginFragment_ = null; 
       } 

       transaction_.add(logoutFragment_, "logout"); 
       transaction_.commit(); 
      } 

      if (fragmentManager_.findFragmentByTag("logout") == null) 
       fragment = LogoutFragment.newInstance(context_); 
      else 
       fragment = fragmentManager_.findFragmentByTag("logout"); 
     } 
     break; 

    case 1: 
     fragment = HomeFragment.newInstance(context_); 
     break; 

    case 2: 
     fragment = RegisterFragment.newInstance(context_); 
     break; 

    default: 
     break; 
    } 

    return fragment; 
} 

このコードでは何もしませんが、誰かが私が間違っていることを見て、私は正しい方向に私はそれをたくさんいただきたいと思います!

+0

私はPagerAdapterでgetItemを変更する必要があると思います。表示されなければならないフラグメントが返されます。 – pawelzieba

+0

@dziobasそれは私が私の質問で説明したマジックを運行しようとしてきた場所です。 – velu

+0

fragment2はtab1をクリックすると呼び出されますが、なぜtab2が呼び出されるのかわかりません。アダプターエラーですか? –

答えて

10

あなたはビューを介してスワイプとして、それは(もあなたはGetItem関数を呼び出すとき)の断片を削除しますので、あなたが明示的にそれらを自分で削除する必要はありませんだってFragmentStatePagerAdapter

http://android-developers.blogspot.com/2011_08_01_archive.html

を使用してみてください。

私は同じ問題を抱えています。

コードを試してif (fragment!=null)ブロックを削除しても機能します。

+0

いくつかのコードを表示できますか?私はあなたの足跡をたどったので、私は非常に感謝していました。 – cesards

0

ステートメントは、状況によってはcase 0のフラグメント4を返さないようにしてください。

+0

はい、そうしなければなりません。そして、私は一日中それを行う正しい方法を見つけようとしています。私は自分の質問を更新し、これまでどのようにこれをやろうとしているのかを付け加えました。 – velu

0

ねえこの問題は、私のFragmentPagerAdapter内のリストを使用してさまざまなフラグメントを処理し、次にgetItemがそうであるように解決しました。

public void addScreen(String tag, Class<?> clss, Bundle args){ 
     if(clss!=null){ 
      TabInfo info = new TabInfo(tag, clss, args); 
      screens.add(info); 
     } 
    } 
@Override 
    public Fragment getItem(int position) { 
     TabInfo info = screens.get(position); 
     return Fragment.instantiate(context, info.clss.getName(), info.args); 
    } 

私はその後、プログラムモリシーはあなたがいることをViewPagerを伝えたい時はいつでもmAdapter.notifyDataSetChanged()を呼び出す必要があり、言ったように、その後ハンドラ

mAdapter.notifyDataSetChanged() 
3

に呼び出すリスト項目(断片)を再配置/追加/削除破片は交換されました。しかし、アダプタ内のgetItemPosition()抽象関数をオーバーライドし、隠されるべき古い引数として呼び出されたときにPOSITION_NONEを返さなければなりません。それ以外の場合、ViewPagerは現在のすべてのフラグメントを保持します。

詳細およびコード例については、this answerからrelated questionを参照してください。

0

FragmentPagerAdapterのタブを挿入/置換する方法については、私のanswerをご覧ください。

0

フラグメントの再読み込みを避けるためにoffScreenPageLimitを5に設定してください(あなたの使用状況に基づいて)。スワップ時にリロードするのではなく、置き換えられたものがそのまま残ります。

mViewPager.setOffscreenPageLimit(5); 
関連する問題