Android Fragment 浅谈

Fragment介绍

下面是来自Google对Fragment的介绍:
Fragment译指片段,片段是应用程序的用户界面或行为的一部分(可理解成一种UI交互界面),可以放在活动中。与片段的交互是通过FragmentManager完成的。
Fragment类可以使用多种方法来实现各种各样的结果。在其核心中,它代表了一个在更大的活动中运行的特定操作或接口。一个片段与它所处的活动密切相关,不能脱离一个片段使用。尽管Fragment定义了自己的生命周期,但这个生命周期依赖于它的活动:如果活动被停止,那么它内部的任何片段都不能启动;当活动被销毁时,所有片段都将被销毁。
以下是我的理解:
Fragment是一个能够与用户交互的界面,因为它的构造方法必须传入一个布局文件。但不同于Activity直接指定一个布局文件,Activity可以通过FragmentManager,实现将一个或多个Fragment加入自己的布局容器中,在这里可以把Fragment理解成一个View。这样做的好处是:
Activity可以在运行时动态地实现对Frament的增加和移除操作;
不同的Activity可以复用Fragment;
一个Activity可以有多个Frament,实现模块化管理,尤其是对平板和手机两种界面的适配。
Fragment离不开Activity,它的生命周期和Activity息息相关,基本上和Activity的生命周期保持一致;管理Fragment需要通过FragmentManager操作。

Fragment版本

Google提供了两个不同包下的版本:
第一个版本:android.app.Fragmet
第二个版本:androidx.fragment.app.Fragment
第一个版本已经在API 28(Android 9.0)中以上被弃用了,如果你的App是基于API 28以上开发的,那么官方建议使用第二个版本。
FragmentAPI28
第二个版本是静态支持库版本,使用此支持版本而不是框架版本的主要区别是:
你的Activity必须继承自FragmentActivity;
你的必须调用FragmentActivity.getSupportFragmentManager来获取FragmentManager。
我们通常自定义的Activity都继承自AppCompactActivity,而AppCompactActivity继承自FragmentActivity,所以可以直接在Activity里调用getSupportedFragmentManager得到FragmentManager,以下是AppCompactActivity的继承层次:
AppCompactActivity继承层次
有的博客中写到导入android.support.v4.app包下的Fragment,v4支持包已经不再支持了,被AndroidX包取代了。Google推荐使用AndroidX静态支持库创建项目,也就是使用上述的第二个版本。
v4Fragment

Fragment Lifecycle生命周期

尽管Fragment的生命周期与它所绑定的Activity相关,但它与标准的Activity生命周期也有一些不同,以下是支持库版本的Fragment生命周期:
1.onAttach(Activity)
2.onCreate(Bundle)
3.onCreateView(LayoutInflater, ViewGroup, Bundle)
4.onViewCreated (View view, Bundle savedInstanceState)
5.onViewStateRestored(Bundle)
6.onStart()
7.onResume()
8.onPause()
9.onStop()
10.onDestroyView()
11.onDestroy()
12.onDetach()
可以看到大部分生命周期的方法与Activity相同,那些增加的方法用来将Fragment绑定到Activity上、实例化Fragment自己的XML布局等。
注意到有一些博客的第4步不是onViewCreated方法,取而代之的是onActivityCreated方法,原因是在支持库Fragment版本中,Google弃用了onActivityCreated方法。
onActivityCreated

继承Fragment

使用Fragment就像使用Activity一样,需要自定义Fragment,并使其继承自Fragment。创建自定义的Fragment之后,必须使它绑定到Activity上,通过有两种方式:
1.静态添加,通过fragment标签将自定义Fragment添加到想要绑定的Activity的XML布局中;
2.动态添加,在Activity中通过调用getSupportedFragmentManager得到的FragmentManager,动态地添加Fragment。
一般采用第二种动态添加Fragment的方式,相比于静态添加的好处是:Activity可以在运行时移除或添加Fragment,发挥出Fragment模块化、可复用的优势。
自定义Fragment需要复写几个重要的方法,如onCreateView和onViewCreated。
下面分析onCreateView方法,源码如下:

    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
            @Nullable Bundle savedInstanceState) {
   
        if (mContentLayoutId != 0) {
   
            return inflater.inflate(mContentLayoutId, container, false);
        }
        return null;
    }

onCreateView方法用来将Fragment的XML布局文件通过LayoutInflater实例化,可以看到首先判断mContentLayoutId是否为空,如果不为null,那么就实例化,否则返回null。mContentLayoutId是Fragment的一个int变量:

    @LayoutRes
    private int mContentLayoutId;

mContentLayoutId是通过Fragment的带参构造函数引入的,源码如下:

    @ContentView
    public Fragment(@LayoutRes int contentLayoutId) {
   
        this();
        mContentLayoutId = contentLayoutId;
    }

因此,如果我们自定义的Fragment没有重写onCreateView方法,那么我们在new一个新的Fragment时,必须使用带参数的构造器,并且参数是Fragment的布局ID。通常我们都复写onCreateView方法,这样就可以直接指定Fragment的XML布局,并且new一个新的Fragment时就无需使用带参数的构造器。

   public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
            @Nullable Bundle savedInstanceState) {
   
		return inflater.inflate(R.layout.myfragment, container, fasle);
		//R.layout.myfragment是自定义Fragment想要绑定的XML布局文件
    }

如果不复写onCreateView方法,并且想要使用带参数的构造函数,那么就需要复写Fragment带参数的构造函数,并且在new一个新的Fragment时,要将Fragment的布局文件Id引入构造函数的参数中。

	public MyFragment(int id) {
   
		super(id);
	}
	//MyFragment继承自Fragment,也就是自定义的Fragment
	//复写构造函数时,一定要super父对象的构造函数
	//这样就可以new MyFragment(R.layout.myfragment),并且无需复写onCreateView

Google建议在onViewCreated中,对Fragment实例化后的布局文件View进行操作。onViewCreated在onCreateView之后被调用,并且onViewCreated方法的参数View view来自onCreateView方法返回的View。因此,我们应该在onViewCreated中,使用view.findViewById()等方法,实现对view中控件的引用以及设置监听器等操作。

    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
   
    	Button MyBtn = view.findViewById(R.id.btn_my);
    	MyBtn.setOnClickedListener(new View.OnClickedListener...);
    }

管理Fragment

那么如何使用Fragment呢?对Fragment的管理,比如添加、移除和替换等操作,都是通过FragmentManager完成的。任何一个AppCompactActivity都可以通过调用getSupportFragmentManager得到一个FragmentManager,该方法是AppCompactActivity继承自FragmentActivity得到的。
Activity通过FragmentManager管理Fragment,而Fragment关联着一个布局,相当于Activity间接地使用Fragment关联的那个布局。这样Activity就不会受限于固定的布局,通过FragmentManager及Fragment便可以使用多种布局,组合多个不同的布局实现更复杂的界面,动态地添加和移除布局,更为自由和模块化,这就是Fragment存在的意义。

获取FragmentManager

通常第一步是获取FragmentManager,首先来看看FragmentActivity里获取FragmentManager的方法getSupportFragmentManager。

public class FragmentActivity extends ComponentActivity implements
        ActivityCompat.OnRequestPermissionsResultCallback,
        ActivityCompat.RequestPermissionsRequestCodeValidator {
   
        final FragmentController mFragments = FragmentController.createController(new HostCallbacks());

		//返回FragmentManager以便与此Activity相关联的Fragment交互
	    public FragmentManager getSupportFragmentManager() {
   
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值