Fragment简介和使用实例

转载请注明出处http://blog.csdn.net/yegongheng/article/details/38013349


Fragment 是什么

       今天我们来学习一个比较重要的组件--Fragment。Fragment在应用开发中应用得非常的频繁,特别是在开发一些需要兼容手机设备、平板设备和智能电视等大屏幕设备的应用,Fragment发挥着重要的作用。那说了这么多,Fragment到底是什么呢?在这里我们先简单的用一句话总结就是:Fragment是Android为了应用适配不同设备的大屏幕、支持更加动态和灵活的UI设计所提供的一个组件。
       说到Fragment,就会联想到Activity,因为Fragment对象在应用中一般是不能独立存在的,它必须嵌入到activity中,而且Fragment的生命周期直接受所在的activity的影响。例如:当activity暂停时,他拥有的所有的Fragment都暂停了,当activity销毁时,他拥有的所有Fragment都被销毁。然而,当activity运行时(在onResume()之后,onPause()之前),可以单独地操作每个Fragment,比如添加或删除它们。当中执行上述针对Fragment的事务时,可以将事务添加到一个栈中,这个栈被activity管理,栈中的每一条都是一个Fragment的一次事务。有了这个栈,就可以反向执行Fragment的事务,这样就可以在Fragment级支持“返回”键(向后导航)。
        当向activity中添加一个Fragment时,它须置于ViewGroup控件中,并且需定义Fragment自己的界面。可以在layout.xml布局文件中声明Fragment,元素为:<fragment>;也可以在代码中创建Fragment,然后把它加入到ViewGroup
控件中。然而,Fragment不一定非要放在activity的界面中,它可以隐藏在后台为activity工作。
        Android在3.0之后引入了Fragment的概念,主要目的是用在大屏幕设备-例如平板电脑上,以便支持更加动态和灵活的UI设计。 平板电脑的屏幕尺寸比手机大得多,因此有更多的空间来存放更多的UI组件,并且这些组件之间会产生更多的交互。Fragment允许 这样的一种设计,而不需要你亲自来管理viewhierarchy的复杂变化。通过将Activity的布局分散到Fragment中,你可以在运行时修改 Activity的外观,并在由Activity管理的Back stack中保存那些变化。
         例如,一个新闻应用可以在屏幕的左侧使用一个Fragment来展示一个文章的列表,然后在屏幕右侧使用另一个Fragment来展示 一篇文章,两个Fragment并排显示在相同的一个Activity中,并且每一个Fragment拥有它自己的一套生命周期回调方法,并且处理它 们自己的用户输入事件。因此,取代使用一个activity来选择一篇文章而另一个activity来阅读文章的方式,用户可以在同一个activity 中选择一篇文章并且阅读,如图所示:

         Fragment在你的应用中应当是一个模块化和可重用的组件。即,因为fragment定义了它自己的布局,以及通过自己的生命周期回 调方法来定义自己的行为,你可以将Fragment包含到多个Activity中,这点特别重要,因为允许你将你的用户体验适配到不同的屏幕尺寸 。举个例子,你可能仅当在屏幕尺寸足够大时,在一个activity中包含多个fragment并且当不属于这种情况时,会启动另一个单独的使用不 同fragment的activity。
        继续之前那个新闻的例子-当运行在一个特别大的屏幕时(例如平板电脑),应用可以在activity A中嵌入2个fragment。然而,在一个 正常尺寸的屏幕(例如手机)上,没有足够的空间同事供2个fragment使用。因此,activity A会仅含文章列表的fragment,而当用户选择 一篇文章时,它会启动activity B,它包含阅读文章的fragment B。因此,应用可以同时支持上图中的2种模式。

Fragment生命周期

        Fragment虽然必须嵌入到Activity才能使用,但它有自己的一套生命周期回调方法,其生命周期与Activity的生命周期类似,同时它受其所属的Activity(宿主Activity)生命周期的直接影响,例如:当activity暂停时,他拥有的所有的Fragment都暂停了,当activity销毁时,他拥有的所有Fragment都被销毁。下面是Fragment生命周期图(图1.1)以及与宿主Activity生命周期之间的关系图示(图1.2):
           
               图1.1                                                                               图1.2
下面将一一介绍Fragment各个回调方法的特性和使用:
      onAttach(): 当Fragment被绑定到Activity事调用(Activity会被传入);
      onCreate(): 当Fragment被创建时,系统调用该方法。在实现代码中,应当初始化想要在Fragment保持的必要组件,当Fragment暂停或停止后可以被恢复;(此方法在实现一个Fragment时必须)
      onCreateView(): 在Fragment第一次绘制界面时系统会调用此方法,为绘制Fragment的UI,方法需返回一个View对象,该对象是Fragment布局的根View。若Fragment不提供UI,则返回null;(此方法在实现一个Fragment时必须)
      o nActivityCreated(): 当Activity被创建回调onCreate()方法后,系统调用此方法;
      onStart(): 当Fragment呈现给用户变得可见之前调用 ( 在宿主Activity回调完onStart()方法后调用 ) ,此时用户与界面处于可见不可交互的状态。
      onResume(): 当用户和界面可以互相交互时调用(在宿主Activity回调完onResume()方法后调用)。
       onPause():当需要开启一个新的Activity或替换一个新的Fragment时,系统调用此方法(在宿主Activity回调完onPause()方法后调用)。此时用户将要离开与Fragment界面的交互,因此一般来讲应在此方法中保存一些需要持久化的变化。 (此方法在实现一个Fragment时必须)
       onStop():当Fragment变得完全不可见时,系统调用该方法(在宿主Activity回调完onStop()方法后回调),出现此状态的原因可能是另一个Activity覆盖此宿主Activity或此Fragment被替换,此时Fragment面临被销毁。
      onDestoryView():当和Fragment关联的View hierarchy被移除时,系统调用该方法。
       onDestory():当Fragment被销毁时,系统调用该方法。
      onDetach():当Fragment与宿主Activity解除关联时,系统调用该方法。
下面我们通过一个例子来具体了解一下Fragment的生命周期各个回调函数在何时调用,要使用Fragment,需创建一个继承Fragment的子类(LifeCycleFragment),我们这里重写了Fragment的全部生命周期函数,代码如下:
public class LifeCycleFragment extends Fragment {

	private static final String TAG = "FragmentLifeCycle";
	
	@Override
	public void onAttach(Activity activity) {
		// TODO Auto-generated method stub
		super.onAttach(activity);
		Log.i(TAG, "onAttach");
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		Log.i(TAG, "onCreate
  • 25
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个在Fragment使用RecyclerView的完整示例: 1. 首先,在你的布局文件中添加一个RecyclerView: ```xml <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 然后,在你的Fragment中初始化RecyclerView和Adapter: ```kotlin class MyFragment : Fragment() { private lateinit var recyclerView: RecyclerView private lateinit var adapter: MyAdapter override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val view = inflater.inflate(R.layout.fragment_my, container, false) recyclerView = view.findViewById(R.id.recycler_view) adapter = MyAdapter() recyclerView.adapter = adapter recyclerView.layoutManager = LinearLayoutManager(context) return view } // ... } ``` 3. 接下来,实现RecyclerView的Adapter,例如: ```kotlin class MyAdapter : RecyclerView.Adapter<MyViewHolder>() { private val data = listOf("Item 1", "Item 2", "Item 3") override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_my, parent, false) return MyViewHolder(view) } override fun onBindViewHolder(holder: MyViewHolder, position: Int) { holder.bind(data[position]) } override fun getItemCount(): Int = data.size } class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private val textView: TextView = itemView.findViewById(R.id.text_view) fun bind(text: String) { textView.text = text } } ``` 4. 最后,创建一个RecyclerView的item布局,例如: ```xml <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp" android:textSize="18sp" /> ``` 这样就可以在Fragment使用RecyclerView了,当然你还可以根据自己的需求对RecyclerView进行更多的定制和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值