一、使用静态工厂方法newInstance(…)来获取Fragment实例
可以在Google的代码中发现这种写法,好处是接收确切的参数,返回一个Fragment实例,避免了在创建Fragment的时候无法在类外部知道所需参数的问题,在合作开发的时候特别有用。
还有就是Fragment推荐使用setArguments来传递参数,避免在横竖屏切换的时候Fragment自动调用自己的无参构造函数,导致数据丢失。
public static WeatherFragment newInstance(String cityName) {
Bundle args = new Bundle();
args.putString(cityName,"cityName");
WeatherFragment fragment = new WeatherFragment();
fragment.setArguments(args);
return fragment;
}
二、fragment的状态保存和恢复
不要在Fragment里面保存ViewState!
为了让你的代码更加清晰和稳定,最好区分清楚fragment状态保存和view状态保存,
如果某个属性属于View,则不要在Fragment中做它的状态保存,除非属性属于Fragment。
每一个自定义View都有义务实现状态的保存,可以像EditText一样,设置一个开关来选择是否保存
比如说:android:freezeText=“true/false”。
public class CustomView extends View {
...
@Override
public Parcelable onSaveInstanceState() {
Bundle bundle = new Bundle();
// 在这里保存当前状态
return bundle;
}
@Override
public void onRestoreInstanceState(Parcelable state) {
super.onRestoreInstanceState(state);
// 恢复保存的状态
}
...
}
三、避免错误操作导致视图重叠
在add或者replace的时候,调用含有TAG参数的那个方法,之后再add相同TAG的Fragment的话,之前的会被替换掉,也就不会同时出现多个相同的Fragment了。
public class WeatherFragment extends Fragment {
//TAG
public static final String TAG = WeatherFragment.class.getSimpleName();
不过为了最大限度的重用,可以在Activity的onCreate(Bundle savedInstanceState)
中判断savedInstanceState
是否不为空;
不为空的话,先用getSupportFragmentManager(). findFragmentByTag()
找一下,找到实例就不用再次创建。
WeatherFragment fragment = null;
if(savedInstanceState!=null){
fragment = getSupportFragmentManager().findFragmentByTag(WeatherFragment.TAG);
}
if(fragment == null){
fragment = WeatherFragment.newInstance(...);
}
四、监听虚拟或者实体按键事件
mRootView = getView();
mRootView.setFocusable(true);
mRootView.setFocusableInTouchMode(true);
mRootView.setOnKeyListener(new View.OnKeyListener(){
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
//不一定是要触发返回栈,可以做一些其他的事情,我只是举个栗子。
getActivity().onBackPressed();
return true;
}
return false;
}
});
五、使用最大化的DialogFragment来实现浮动层级
如果你有一个列表页面,点击Item打开详情页,你可以使用最大化的DialogFragment来显示详情页,
此时并不需要提供一个具体的ContainerId即可显示,因为详情页一般情况下在Phone上都是占据满屏幕的,用DialogFragment即可。
不过这并不是最好的做法,在要考虑到Tablet适配的情况下,如下图
Tablet上是嵌入的,而手机上是占据全部空间。
此时可以把详情页单纯用Fragment实现,满足Tablet设备嵌入的需要,在手机上可以使用全屏的DialogFragment来包裹Fragment,之后只需要DialogFragment.show(…)即可。
从这里就可以看出,Fragment的使用其实是非常灵活的。
六、使用fragment还是activity的建议
如果后一个页面不需要用到前一个页面的太多数据,推荐用Activity展示,否则最好用Fragment