第一行代码Android个人笔记(三)——探究Fragment

一、动态添加Fragment

很简单,直接上代码

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.setOnClickListener {
            replaceFragment(AnotherRightFragment())
        }
        replaceFragment(RightFragment())
    }

    //替换Fragment的函数
    fun replaceFragment(fragment: Fragment){
        
        //先获取fragmentManager,在Activity中使用supportFragmentManager
        val fragmentManager = supportFragmentManager
        
        //开启一个事务
        val transaction = fragmentManager.beginTransaction()
        
        //使用replace()替换Fragment;参数一:Fragment父节点,参数二:要替换为的Fragment
        transaction.replace(R.id.rightLayout,fragment)
        
        //提交事务
        transaction.commit()
    }
}

此时,按下返回键会直接退出应用程序,那么如何将fragment添加入返回栈呢?
只需要一行代码

//添加至返回栈
transaction.addToBackStack(null)

二、Fragment和Activity间的通信

1、Activity中获取Fragment

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

由于findFragmentById()方法返回的是Fragment实例,所以这里如果我们想使用LeftFragment里的方法,就必须使用 as LeftFragment 进行类型转换

由于fragment同样支持plugin: 'kotlin-android-extensions'所以我们也可以在kotlin的代码中直接获取:

val fragment2:LeftFragment = leftFrag as LeftFragment

2、Fragment中获取Activity

可以在fragment里使用getActivity()方法获取 它所在的 activity
如果该fragment没有被放进activity中,则使用getActivity()会返回null,所以要进行判空处理

if (activity != null){
      val mainActivity = activity as MainActivity
}

3、Fragment中获取Fragment

先获取Activity,再使用Activity获取Fragment

三、Fragment生命周期

偷个懒,参见:Fragment生命周期

四、实现根据屏幕大小动态加载布局

先在res目录下创建layout-large文件夹,再在文件夹下创建与要适配的activity界面同名称的文件,如这里是:activity_main.xml

  • 注意:若layout-large文件夹上右键-NEW-XML-Layout XML File提示无法创建重复的布局文件

方法:在该文件夹上右键默认还是在layout文件夹内创建布局文件,与原来的activity_main冲突。
应该在该文件夹右键-NEW-Layout Resource File创建新的xml。

方法
则在大屏幕设备上会自动加载layout-large文件夹中的activity_main。

- 附:Android中常见的限定符

  • 屏幕大小的限定符
    • small 提供给小屏幕设备的资源
    • normal 提供给中等屏幕设备的资源
    • large 提供给大屏幕设备
    • xlarge 提供给超大屏幕设备的资源
  • 屏幕分辨率的限定符
    • ldpi 提供给低分辨率设备的资源(120dpi以下)
    • mdpi 提供给中等分辨率设备的资源(120dpi-160dpi)
    • hdpi 提供给高分辨率设备的资源(160dpi-240dpi)
    • xhdpi 提供给超高分辨率设备的资源(240dpi-320dpi)
    • xxhdpi 提供给更高分辨率设备的资源(320dpi-480dpi)
  • 屏幕方向的限定符
    • land 提供给横屏设备的资源
    • port 提供给竖屏设备的资源
  • 屏幕宽度限定符
    • layout-sw600dp
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值