【Android】Fragment使用简介

一、使用静态工厂方法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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值