fragment可以在xml中添加,也可以直接新建ListViewFragemnt extends Fragment ,在这种方法的OnCreateView方法中,使用layoutinflator加载xml文件View,返回View,然后就是根据View去初始化ListView,数据直接从数据库取出,在适配器Adapter中更新显示数据。
1、在Fragment中viewgetActivity()findViewById(Ridxx); 2、其中getActivity可以获取到该Fragment引用的Activity, 3、之后通过findViewById获取到其他与该Activity相关联的Fragment中的控件引用。
为了管理Activity中的fragments,需要使用FragmentManager
为了得到它,需要调用Activity中的getFragmentManager()方法。
因为FragmentManager的API是在 Android 30,也即API level 11开始引入的,所以对于之前的版本,需要使用support library中的FragmentActivity,并且使用getSupportFragmentManager()方法。
用FragmentManager可以做的工作有:
得到Activity中存在的fragment:
使用findFragmentById()或findFragmentByTag()方法。
将fragmentd出back stack:
popBackStack():将back stack中最后一次的fragment转换d出。如果没有可以出栈的东西,返回false。
这个函数是异步的:它将d出栈的请求加入队列,但是这个动作直到应用回到事件循环才会执行。
为back stack加上监听器:
addOnBackStackChangedListener()
Performing Fragment Transactions
使用Fragment时,可以通过用户交互来执行一些动作,比如增加、移除、替换等。
所有这些改变构成一个集合,这个集合被叫做一个transaction。
可以调用FragmentTransaction中的方法来处理这个transaction,并且可以将transaction存进由activity管理的back stack中,这样用户就可以进行fragment变化的回退 *** 作。
可以这样得到FragmentTransaction类的实例:
FragmentManager fragmentManager =getFragmentManager();
FragmentTransaction fragmentTransaction =fragmentManagerbeginTransaction();
每个transaction是一组同时执行的变化的集合。
用add(), remove(), replace()方法,把所有需要的变化加进去,然后调用commit()方法,将这些变化应用。
在commit()方法之前,你可以调用addToBackStack(),把这个transaction加入back stack中去,这个back stack是由activity管理的,当用户按返回键时,就会回到上一个fragment的状态。
比如下面的代码就是用一个新的fragment取代之前的fragment,并且将前次的状态存储在back stack中。
// Create new fragment and transaction
Fragment newFragment = newExampleFragment();
FragmentTransaction transaction =getFragmentManager()beginTransaction();
// Replace whatever is in thefragment_container view with this fragment,
// and add the transaction to the backstack
transactionreplace(Ridfragment_container,newFragment);
transactionaddToBackStack(null);
// Commit the transaction
transactioncommit();
在这个例子中,newFragment将取代在Ridfragment_container容器中的fragment,如果没有,将直接添加新的fragment。
通过调用addToBackStack(),commit()的一系列转换作为一个transaction被存储在back stack中,用户按Back键可以返回上一个转换前的状态。
当你移除一个fragment的时候,如果commit()之前没有调用 addToBackStack(),那个fragment将会是destroyed;如果调用了addToBackStack(),这个fragment 会是stopped,可以通过返回键来恢复。
关于commit()方法
调用commit()方法并不能立即执行transaction中包含的改变动作,commit()方法把transaction加入activity的UI线程队列中。
但是,如果觉得有必要的话,可以调用executePendingTransactions()方法来立即执行commit()提供的transaction。
这样做通常是没有必要的,除非这个transaction被其他线程依赖。
注意:你只能在activity存储它的状态(当用户要离开activity时)之前调用commit(),如果在存储状态之后调用commit(),将会抛出一个异常。
这是因为当activity再次被恢复时commit之后的状态将丢失。如果丢失也没关系,那么使用commitAllowingStateLoss()方法。
没显示可能是的 listsize() <=0 了,因为你的数据是网络异步加载的,自己也开了线程,这个应该清楚一下,所以一开始你传入的list,size就0了,getItemCount() 这里就 return 0;试下在数据加载完成的时候 (while()之后)调用notifyDataSetChanged();刷新一下
Fragment获取它所在的Activity:调用Fragment的getActivity()方法即可返回它所在的Activity
Activity获取它包含的Fragment:调用Activity关联的FragmentManager的findFragmentById(int id)或findFragmentByTag(String tag)方法即可获取指定的Fragment
在界面布局文件中使用<fragment>元素添加Fragment时,可以为<fragment>元素指定android:id或android:tag属性,这两个属性都可用于标识该Fragment,接下来可以通过findFragmentById(int id)或者findFragmentByTag(String tag)来获取该Fragment
Activity用来管理Fragment。因为一个Fragment可以被多个Activity嵌套,有个共同的业务模块就可以复用了
Fragment具有自己生命周期,是模块化UI的良好组件。
Fragment的生命周期是寄托到Activity中,Fragment可以被Attach添加和Detach释放。
Fragments是view controllers,它们包含可测试的,解耦的业务逻辑块,由于Fragments是构建在views之上的,而views很容易实现动画效果,因此Fragments在屏幕切换时具有更好的控制。
Fragment可以像普通对象那样自由的创建和控制,传递参数更加容易和方便,也不用处理系统相关的事情,显示方式、替换、不管是整体还是部分,都可以做到相应的更改。
可以看出Fragment生命周期与Activity类似
解释如下:
上面的方法中,只有onCreateView()在重写时不用写super方法,其他都需要。
因为Fragment依赖Activity,那么Fragment和Activity的生命周期可谓是息息相关,如下图所示
Activity的FragmentManager负责调用队列中Fragment的生命周期方法,只要Fragment的状态与Activity的状态保持了同步,托管Activity的FragmentManager便会继续调用其他生命周期方法以继续保持Fragment与Activity的状态一致。
Activity-onCreate(begin) ,Fragment-onAttach-onCreate-onCreateView-onViewCreated, Activity-onCreate(end) ,Fragment-onActivityCreated, Activity-onStart ,Fragment-onStart, Activity-onResume ,Fragment-onResume
Fragment-onPause, Activity-onPause ,Fragment-onStop, Activity-onStop
Activity-onRestart-onStart ,Fragment-onStart, Activity-onResume ,Fragment-onResume
Fragment-onPause, Activity-onPause ,Fragment-onStop, Activity-onStop ,Fragment-onDestroyView-onDestroy-onDetach, Activity-onDestroy
Fragment的管理则交由FragmentActivity的FragmentManager来实现。
获取方式:
注意 :在fragment创建childFragment的时候,需要注意的是:使用getChildFragmentManager() 使用getFragmentManager()会导致内存泄漏
常用API:
popBackStackImmediate相关的方法与上面逻辑是一样的与上面不同的是,在调用的时候会立即执行d出。
通过FragmentTransaction实现在Activity运行时可动态地加入、移除、交换Fragment
FragmentTransaction的主要方法介绍
针对在一个Activity中的某个Layout中切换Fragment,无非两种方法:
当移除或替换一个片段并向返回栈添加事务时,系统会停止(而非销毁)移除的片段。 如果用户执行回退 *** 作进行片段恢复,该片段将重新启动。
具体实例可参看: Fragment的addToBackStack()使用
commit(), commitNow()和commitAllowingStateLoss()区别分析
实例:
使用setArguments(Bundle args)传递,在onCreate中使用getArguments()取出。和Activity的Intent恢复机制类似。
1、如果你需要在Fragment中用到宿主Activity对象,建议在你的基类Fragment定义一个Activity的全局变量,在onAttach中初始化,这不是最好的解决办法,但这可以有效避免一些意外Crash。
2、onHiddenChanged的回调时机
当使用add()+show(),hide()跳转新的Fragment时,旧的Fragment回调onHiddenChanged(),不会回调生命周期方法,而新的Fragment在创建时是不会回调onHiddenChanged()
推荐阅读: Fragment全解析系列(二):正确的使用姿势 、 Fragment全解析系列(一):那些年踩过的坑
以上就是关于如何使用Fragment与数据绑定全部的内容,包括:如何使用Fragment与数据绑定、fragment 怎么获取到activity、怎么在fragment中得到fragmentmanager等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)