使用newInstance和动画对片段进行扩充

时间:2016-03-16 13:45:38

标签: android android-layout android-fragments android-animation

在ViewPager中使用fragmentTransaction.setCustomAnimations (android.R.animator.fade_in, android.R.animator.fade_out);而不是使用FragmentTransaction和MyFragment.newInstance()对片段进行膨胀时,New MyFragment()相当于什么?

请注意,如果我只是将android:animateLayoutChanges="true"添加到MainActivity.xml中的ViewPager,它会成功实现默认动画,但不幸的是,我第一次将父片段与嵌套片段交换时,它使用两者滚动淡入动画。在这种情况下,似乎与默认动画有一些冲突。在此处查看此行为:

http://sendvid.com/yuc3fapq

MyAdapter.java

/**
 *  PageFragmentListener for switching fragment.
 */
public PageFragmentListener mListener = new PageFragmentListener() {
    @Override
    public void onSwitchToNextFragment(final String id) {
        mFragmentManager.beginTransaction().remove(mFragment).commit();
        if (mFragment instanceof ItemListFragment){     
            Bundle arguments = new Bundle();
            arguments.putString(Constants.ARG_ITEM_ID, id);   
            // switch detail fragment
            mFragment = ItemOneDetailFragment.newInstance(mListener);   
            mFragment.setArguments(arguments);
        }else{      // DetailFragment
             // switch list fragment
            mFragment = ItemListFragment.newInstance(mListener); 
        }

        notifyDataSetChanged();  // notify changes
    }
};

public MyAdapter(FragmentManager fm) {
    super(fm);
    mFragmentManager = fm;
    List<Fragment> fragments = fm.getFragments();
    if(fragments != null){
        for(Fragment f : fragments){
            if(f instanceof ItemListFragment || f instanceof ItemOneDetailFragment){
                mFragment = (BaseFragment) f;
            }
        }
    }
 }

@Override
public Fragment getItem(int position) {
    if (position == 0)      // Tab-1
        return FragmentA.newInstance();

    if (position == 1)      // Tab-2
        return FragmentB.newInstance();

    if (position == 2) {    // Tab-3
        if (mFragment==null)    // first time => create list fragment
            mFragment = ItemListFragment.newInstance(mListener);

        return mFragment;
    }

    return null;
}

ItemListFragment.java

public static ItemListFragment newInstance(PageFragmentListener listener) {
    ItemListFragment fragment = new ItemListFragment();
    fragment.mListener = listener;
    return fragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View root = inflater.inflate(R.layout.fragment_item_list, container, false);
    initLayout(root);
    return root;
}

1 个答案:

答案 0 :(得分:1)

newInstance()与您创建FragmentTransaction的方式无关,它只是帮助您实例化Fragment并传入参数。在FragmentTransaction内部硬编码创建Fragment的逻辑也不是一个好主意:在某些时候,您可能希望在没有动画的情况下重复使用它。