Fragment是活动的一部分,可以实现更多模块化活动设计。片段封装了功能,以便更容易在活动和布局中重用。
Android 设备有多种屏幕尺寸和密度。片段简化了组件在不同布局及其逻辑中的重用。您可以为手机(手机)构建单窗格布局,为平板电脑构建多窗格布局。您还可以使用片段来支持智能手机上横向和纵向的不同布局。
下图显示了如何将片段定义的两个 UI 模块合并为一个活动以用于平板电脑设计,但在手机设计中将其分开。
片段生命周期
Android Fragment 有自己的生命周期,与 android Activity 非常相似。
- onAttach() :片段实例与活动实例相关联。片段和活动未完全初始化。通常,您会在此方法中获得对使用片段进行进一步初始化工作的活动的引用。
- onCreate() :系统在创建片段时调用此方法。您应该初始化要在片段暂停或停止时保留的片段的基本组件,然后再恢复。
- onCreateView() :当片段第一次绘制其用户界面时,系统会调用此回调。要为片段绘制 UI,您必须从此方法返回一个视图组件,该组件是片段布局的根。如果片段不提供 UI,您可以返回 null。
- onActivityCreated() : onActivityCreated() 在创建宿主活动时在 onCreateView() 方法之后调用。活动和片段实例以及活动的视图层次结构已经创建。此时,可以使用 findViewById() 方法访问视图。例子。在此方法中,您可以实例化需要 Context 对象的对象
- onStart() :一旦片段可见,就会调用 onStart() 方法。
- onResume() :片段变为活动状态。
- onPause() :系统调用此方法作为用户离开片段的第一个指示。这通常是您应该提交任何应该在当前用户会话之外保留的更改的地方。
- onStop() : Fragment 将通过调用 onStop() 停止
- onDestroyView() : Fragment view 会在调用这个方法后销毁
- onDestroy() :调用以对片段状态进行最终清理,但不保证由 Android 平台调用。
片段类型
- 单帧片段:单帧片段用于手机等手持设备,这里我们只能显示一个片段作为视图。
- 列表片段:具有特殊列表视图的片段称为列表片段
- 片段事务:与片段事务一起使用。我们可以将一个片段移动到另一个片段。
处理片段生命周期
一个 Fragment 存在三种状态:
- Resumed :片段在正在运行的活动中可见。
- Paused :另一个 Activity 在前台并获得焦点,但此片段所在的 Activity 仍然可见(前台 Activity 部分透明或未覆盖整个屏幕)。
- 已停止:片段不可见。主机活动已停止或片段已从活动中删除但已添加到返回堆栈中。停止的片段仍然存在(所有状态和成员信息都由系统保留)。但是,它不再对用户可见,如果活动被终止,它将被终止。
Activity生命周期对fragment生命周期的影响:
定义和使用片段
要定义一个新片段,我们可以扩展android.app.Fragment类或其子类之一。
package com.saket.geeksforgeeks.demo;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class DetailFragment extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_rssitem_detail,
container, false);
return view;
}
public void setText(String text)
{
TextView view = (TextView) getView().findViewById(R.id.detailsText);
view.setText(text);
}
}
片段事务:对于动态活动,我们为交互式 UI 设置按钮。如果我们在单击按钮后设置了片段应该出现,那么我们必须从片段管理器获得帮助。它处理活动中的所有片段。我们需要在片段管理器的帮助下设置片段事务并开始事务,然后简单地将片段的布局替换为所需的位置。
/* this code is contributed by rohansadhukhan9 */
Button B = findViewById(R.id.button);
B.setOnClickListener(new View.OnClickListener) {
@Override
public void onClick(View v) {
fragment f = new fragment();
FragmentTransaction t = getSupportFragmentManeger().beginTransaction();
t.replace(R.id.fragment_layout, f).commit();
}
}