Fragment和back栈
Fragment能够创建动态的Activity布局,这些布局可以被修改来使UI发生重大的改变。在某些情况下,和谐改变可以被视为一个新的屏幕-----在这种情况下,用户可能会理所当然的期待Back返回一个布局。同样包括回滚到一个一致性的FragmentTransaction
android为该功能提供了方便的技术,想要将FragmentTransaction添加到back栈中,可以在调用commit方法之前,Fragment Transaction添加到back栈中,可以在调用commit方法之前,在FragmentTransaction中调用addToBackStack方法。
FragmentTransaction fragmentTransaction =fragmentTransaction。beginTransaction();
fragmentTransaction.add(R,id.ui_container,new MyListFragment());
Ftagment fragment =fragmentManager.finFragmentById(R.id.details_fragment);
fragmentTransaction。remove(fragment);
String tag=null;
fragmentTransaction.addToBackStack(Tag);
fragmentTransaction.commit();
当按下back按键是,之前的FragmentTransaction 将会回滚并且UI方将返回到之前的布局
当上下所述的FragmentTransaction 已经被提交,DetailsFragment就会被停止并被移动到back栈中,而不是简单的被销毁,如果Transaction回滚,ListFragment被销毁,DetailsFragment就会重新被启动
使FragmentTransaction 动起来
想要应用众多的默认过度动画中的一个,可以对任意的FragmentTransaction使用setTransition方法,并传入一个FragmentTransaction.TRANSIT_FRAGMENT_*常量:
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
也可以通过使用setCustomAnimations方法对FragmentTransaction应用自定义动画。这个方法接受两个动画的XML资源,一个是通过食物添加的Fragment,另外一个是被删除的Fragment
transaction.setCustomAnimations(R.animator.slide_in_left,R.animator.slide_out_right);
当在布局内替换Fragment时,这种方式对于添加无缝动态过度尤其有用。
Fragment 和Activity 之间的接口
在任何Fragment 中使用 getActivity 方法来返回它嵌入的Activity的引用。这对于查找当钱上下文,使用FragmentManager访问其他Fragment和Activity的View层次中查找View尤其有用
TextView textView =(TextView) getActivity().findViewById(R.id.text.view);
尽管Fragment 可以直接使用主Activity 的FragmentManager 进行通信,但通畅最好考虑使用Activity来做媒介。这样会让Fragment尽可能独立和松耦合。 而Fragment的直接在于决定Fragment中的一时间如何影响主Activity的整体UI性能下降
在Fragment需要和它的主Activity共享的地方,最好在Fragment中创建一个callback接口,而主Activity必须实现它。
重写onAttach 处理程序用来获取主Activity的引用,并确保住Activity实现必要的接口
public inter face onSeasmSelectedListener{
public void onSeasonSelected(Season season);
}
private OnSeasonSelectedListener onSeasonSelectedListener;
private Season currentSeason
public void onAttach(Activity activity){
super.onAttach(activity);
onSeasonSelectedListener=(OnSeasonSelectedListener)activity;
private void setSeason(Season season)
{
currentSeason=season;
onSeasonSelectedListener,onSeasonSelected(season);
}
}
}