2012-04-02 12 views
6

私は現在、今後のアプリケーション用のフレームワークを作成しようとしています。私はActionBarとViewPagerが本当に好きですが、機能がありません。実行時にFragment/Tabを置き換える必要があります。ビューページ内のフラグメント/タブの置換

オフィシャルexampleを使用して、私はreplaceTab()のようなものを見たいと思っていますが、断片自体は私が何をしても更新されません。

答えて

1

あなたがしようとしてください:

fragmentTransaction.remove(yourframent); 

、その後:

fragmentTransaction.add(yournewfragment); 
0

をごFragmentは、レイアウトファイルから作成された場合は、実行時にそれを置き換えることはできません。プログラムで追加したフラグメントのみを正常に置き換えることができます。私はViewPagerに(最後に)フラグメントを追加する必要があり、これをしなかった、あなたが望むものに非常に近いAndroid: can't replace one fragment with another

0

を参照してください:

FragmentTransaction ft = fragmentManager.beginTransaction(); 
    new_fragment = Fragment.instantiate(activity, class_name, args); 

    // The below code removes old fragment and adds the new one at the end. 
    ft.attach(new_fragment);    // <- this adds the fragment at the end 
    ft.detach(old_fragment);    // <- this removes old fragment 

    // This should be what you're looking for when adding to an Activity instead of a ViewPager 
    ft.replace(view_id, new_fragment); // <- this is supposed to replace the fragment attached to view_id 

    // Or if the replace does not work, this might work: 
    ft.detach(old_fragment); 
    ft.add(view_id, new_fragment); 

    // Not to be forgotten: ;) 
    ft.commit(); 

上記のコードいくつかの調整が必要になる場合があります、多分のみ必要効果的に働くためにコールを交換する?

置換呼び出しが失敗した場合でも、すべてのフラグメントを切り離して、必要な順序で再貼り付けることができます。

2

フラグメントの変更を処理するには、FragmentPagerAdapterを使用する必要があります。重要なものは3つあります。

  • 前のフラグメントが存在する場合は削除します。

  • notifyDataSetChanged()を呼び出してページのリストを更新します。

  • 古いフラグメントを要求している場合は、getItemPositionのPOSITION_NONEを戻します。

ここでは、左ページと右ページで使用するコードを示します。私は、ユーザーが何をしているかに応じて断片を動的に変更します。

public class MyPager extends ViewPager { 

    private MyPagerAdapter mMyPagerAdapter; 

    public MyPager(Context context, FragmentActivity activity) { 
     super(context); 

     mMyPagerAdapter = new MyPagerAdapter(activity.getSupportFragmentManager()); 
     setAdapter(mMyPagerAdapter); 

    } 
    public void replaceLeftFragment(Fragment fragment) { 
     mMyPagerAdapter.replaceLeftFragment(fragment); 
    } 
    public void replaceRightFragment(Fragment fragment) { 
     mMyPagerAdapter.replaceRightFragment(fragment); 
    } 
} 

public class MyPagerAdapter extends FragmentPagerAdapter { 

    private FragmentManager mFragmentManager; 
    private Fragment mLeftFragment; 
    private Fragment mRightFragment; 

    public MyPagerAdapter(FragmentManager fm) { 
     super(fm); 
     mFragmentManager = fm; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     if (position == 0) { 
      return mLeftFragment; 
     } else { 
      return mRightFragment; 
     } 
    } 

    @Override 
    public int getCount() { 
     final int nbLeft = (mLeftFragment == null) ? 0 : 1; 
     final int nbRight = (mRightFragment == null) ? 0 : 1; 
     return (nbLeft + nbRight); 
    } 

    public void replaceLeftFragment(Fragment fragment) { 
     if (mLeftFragment != null) { 
      mFragmentManager.beginTransaction().remove(mLeftFragment).commit(); 
     } 
     mLeftFragment = fragment; 
     notifyDataSetChanged(); 
    } 
    public void replaceRightFragment(Fragment fragment) { 
     if (mRightFragment != null) { 
      mFragmentManager.beginTransaction().remove(mRightFragment).commit(); 
     } 
     mRightFragment = fragment; 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     if ((object!=mLeftFragment) && (object!=mRightFragment)) { 
      return POSITION_NONE; 
     } 
     return super.getItemPosition(object); 
    } 

} 
関連する問題