android开发非常熟悉的一个用来展示界面的碎片,在我们操作fragment的过程当中,需要注意许许多多的细节,下面就来分享下我遇到的一些细节上的东西。
1.fragment是依附于activity的,但是有自己的生命周期,其中它和activity一样都有生命周期的onresume()方法,我们要注意当我们想执行fragment的onresume的方法时,必定会先执行activity中的onresume方法,还会同样执行所有依附于这个activity的fragment中的onresume方法。
2.fragment中我们经常会调用资源文件中的一些资源,一般都是没有问题的,但是有些时候当你切换fragment太快的时候会发现程序奔溃了,这是为什么呢?一看你发现自己调用资源文件的时候是放在线程中比如说是需要网络请求耗时操作返回的方法里,此时你的fragment已经从activity中remove掉了,再使用getresource()方法得到的是空,然后调资源文件出现空指针错误。解决方案有两种一种是直接在调用前判断if(added()),是否已经添加到activity中,另一种是将获取资源文件的操作放到非延时操作里后将值先存到一个变量里。
3.说下我在android studio中遇到的坑吧,当时我想调试下代码,然后在onhiddenchanged()方法中打了个断点,在切换fragment的时候,发现断点老是进不来,我以为是onhiddenchange()方法没有执行,但是我用的是常用的add,hide,show方法进行切换,每次切换都会执行onhiddenchanged()方法,原来是as自带的坑,那个断点边成了一个叉,表示执行过了,但是没有debug成功,你要rebuild项目或者说重启下as就能debug成功了。。。当时查出时已泪崩。。
4.这是我们经常用到的fragment切换方法,然后很多时候我们需要在hide,或者show这个fragment的时候执行一些操作,这时候你就可以在fragment的父类里面(经常都有个父类比如说basefragment来放一些fragment共有的操作),写一个抽象方法,比如说在transaction.hide(hideFragment);前写mCurrentFragment.beforeHide();当然父类里面要有beforeHide()这个方法,这样在有需要的时候子类fragment只要继承就好了。
//不为空的话隐藏
if (hideFragment !=null) {
transaction.hide(hideFragment);
}
//已经添加的话显示
if (startFragment.isAdded()) {
transaction.show(startFragment);
//第一次添加,并保存tagKey(Fragment类名),可以用getSupportFragmentManager()直接根据tagKey名取出该Fragment进行操作
} else {
transaction.add(R.id.container, startFragment, tagKey);
}
transaction.commitAllowingStateLoss();
补充:
我们可以在Fragment的onAttach()
中通过getArguments()
获得传进来的参数,并在之后使用这些参数。如果要获取Activity对象,不建议调用getActivity()
,而是在onAttach()
中将Context对象强转为Activity对象。
public class Fragment1 extends Fragment{
private static String ARG_PARAM = "param_key";
private String mParam;
private Activity mActivity;
public void onAttach(Context context) {
mActivity = (Activity) context;
mParam = getArguments().getString(ARG_PARAM); //获取参数
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_1, container, false);
TextView view = root.findViewById(R.id.text);
view.setText(mParam);
return root;
}
public static Fragment1 newInstance(String str) {
Fragment1 frag = new Fragment1();
Bundle bundle = new Bundle();
bundle.putString(ARG_PARAM, str);
fragment.setArguments(bundle); //设置参数
return fragment;
}
}
这是我感觉fragment中一些比较有用的tips,今天晚上突然想写写这好久没写的博客,希望对大家有所帮助。。