在ViewPager中使用fragmentTransaction.setCustomAnimations (android.R.animator.fade_in, android.R.animator.fade_out);
而不是使用FragmentTransaction和MyFragment.newInstance()
对片段进行膨胀时,New MyFragment()
相当于什么?
请注意,如果我只是将android:animateLayoutChanges="true"
添加到MainActivity.xml中的ViewPager,它会成功实现默认动画,但不幸的是,我第一次将父片段与嵌套片段交换时,它使用两者滚动和淡入动画。在这种情况下,似乎与默认动画有一些冲突。在此处查看此行为:
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;
}
答案 0 :(得分:1)
newInstance()
与您创建FragmentTransaction
的方式无关,它只是帮助您实例化Fragment
并传入参数。在FragmentTransaction
内部硬编码创建Fragment
的逻辑也不是一个好主意:在某些时候,您可能希望在没有动画的情况下重复使用它。