第一行代码-第三版 第五章 Fragment

Fragment 用于兼顾手机平板

5.1 Fragment是什么

Fragment是一种可以嵌入在Activity当中的UI片段
作用:让程序更加合理和充分地利用大屏幕的空间。

5.2Fragment的使用方式

  1. 先书写fragment的布局文件
  2. 建立对应的类,并让他继承自Fragment(注意:此处需要选择AndroidX库中的Fragment)
  3. 需要重写Fragment中的onCreateView()方法
  4. 在需要Fragment的页面布局中引入,(注意:需要设置name属性,要加上包名)
<fragment
       android:layout_width="0dp"
   android:layout_height="match_parent"
   android:layout_weight="1"
   android:id="@+id/leftLrag"
   android:name="com.swpu.ylq.fragmenttest.LeftFragment"/>
5.2.2动态添加Fragment

前面几个步骤同上:但是在引入时存在区别,这里使用了帧布局(FrameLayout),用于实现动态添加Fragment

 <FrameLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:id="@+id/rightLayout"
        android:layout_weight="1">
    </FrameLayout>

书上的总结:

  1. 创建待添加Fragment的实例
  2. 获取FragmentManager,在Activity中可以直接调用getSupportFragmentManager()方法获取
  3. 开启一个事务,通过调用beginTransaction()方法开启。
  4. 向容器内添加或替换Fragment,一般使用replace()方法来实现,需要传入容器的id和待添加的Fragm实例
  5. 提交事务,调用commit()方法完成。
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        button.setOnClickListener{
            replaceFragment(AnotherRightFragment())
        }
        replaceFragment(RightFragment())
    }

    private fun replaceFragment(fragment: Fragment){
        //1.获取FragmentManager
        val fragmentManager = supportFragmentManager
        //2.开启事务,beginTransaction()
        val transaction = fragmentManager.beginTransaction()
        //3.添加或者替换Fragment,replace()
        transaction.replace(R.id.rightLayout,fragment)
        //4.提交事务,commit()
        transaction.commit()
    }
5.2.3在Fragment中实现返回栈

实现:使用FragmentTransaction中提供的**addToBackStack()**方法

private fun replaceFragment(fragment: Fragment){
        //1.获取FragmentManager
        val fragmentManager = supportFragmentManager
        //2.开启事务,beginTransaction()
        val transaction = fragmentManager.beginTransaction()
        //3.添加或者替换Fragment,replace()
        transaction.replace(R.id.rightLayout,fragment)
        //实现返回栈
        transaction.addToBackStack(null)

        //4.提交事务,commit()
        transaction.commit()
    }
5.2.4 Fragment和Activity之间的交互

存在问题:Fragment和Activity是各自存在于一个独立的类中,它们之间并没有明显的方式来直接进行交互

解决问题:FragmentManager 提供了类似于findViewById()的方法,专门用于从布局文件中获取Fragment的实例。

val fragment=supportFragmentManager.findFragmentById(R.id.leftFrag) as LeftFragment

问题二:如何在Fragment中调用Activity中的方法?

解决问题二:在每个Fragment中可以通过调用getActivity()方法来的得到和当前Fragment相关联的Activity实例(注意:由于getActivity()方法有可能返回null,需要进行判空处理)

2020/4/16 详细内容可以阅读第一行代码,Android第三版

5.3 Fragment 的生命周期

5.3.1 Fragment 的状态和回调
  • 运行状态()
  • 暂停状态
  • 停止状态(进入停止状态的Fragment对于用户是完全不可见得,有可能被系统回收)
  • 销毁状态
    Activity中有的回调方法,Fragment中基本也有,不过Fragment还提供了一些附加的回调方法。
  • onAttach():当Fragment和Activity建立关联时调用
  • onCreateView():为Fragment创建视图(加载布局)是调用。
  • onActivityCreated():确保与Fragment相关联的Activity已经创建完毕是调用。
  • onDestroyView():当与Fragment关联的视图被移除时调用。
  • onDetach():当Fragment和Activity解除关联时调用。

注意:Fragment中也可以通过onSaveInstanceState()方法来保存数据。

5.4 动态加载布局的技巧

存在问题:为了让程序能够根据设备的分辨率或屏幕大小,在决定加载哪一个布局.。(在平板的上有双页模式,而手机只能显示一页内容)。如何让程序知道应该使用双页模式还是单页模式。

解决方法:使用限定符(qualifier
使用步骤:

  1. 增加新的res文件夹,命令layout-“限定符”。如:layout-lagre
  2. 编写对应大小的布局

常见的修饰符;

屏幕特征限定符描述
大小small提供给小屏幕设备的资源
大小normal提供给中等屏幕设备的资源
大小large提供给大屏幕设备的资源
大小xlarge提供给超大屏幕设备的资源
分辨率ldpi提供给低分辨率设备的资源(120dpi以下)
分辨率mdpi提供给中等分辨率设备的资源(120dpi~160dpi)
分辨率hdpi提供给高等分辨率设备的资源(160dpi~240dpi)
分辨率xhdpi提供给超高分辨率设备的资源(240dpi~320dpi)
分辨率xxhdpi提供给超超高分辨率设备的资源(320dpi~480dpi)
方向land提供给横屏设备的资源
方向port提供给竖屏设备的资源
5.4.2使用最小宽度限定符

最小宽度限定符(small-width qualifier):允许我们对屏幕的宽度指定一个最小值(以dp为单位),以这个值最为临界条件。

基本同上面的步骤:
layout-swXXXdp.如layout-sw600dp。
当程序运行在屏幕宽度大于600dp的设备时,加载layout-sw600dp文件夹下的布局文件,小于时:依然使用默认文件夹下面的布局文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值