美文网首页
《第一行代码》第五章 探究Fragment

《第一行代码》第五章 探究Fragment

作者: 番茄tomato | 来源:发表于2020-06-12 11:13 被阅读0次
  • 本篇参考资料《第一行代码 第三版》 2020.4月出版
  • 本篇文章只是本人看书的理解和整理的笔记,更完整的内容还在书上
  • 尊重原作者 请购买正版图书

第四章主要讲了基本的UI控件和基本的布局,这部分已掌握,跳过。
第五章Fragment,这个玩意只在一次做底部导航栏的时候,和ViewPage搭配使用过,现在深入了解。

一 Fragment的使用方式

1.如何创建Fragment
2.如何在Activity中添加Fragment
3.如何在Activity中动态添加Fragment
以上三点P209~P214 简单且细小点很多 不copy了

二 Fragment和Activity的交互

2.1 Fragment中调用Activity

非常简单 直接getActivity(),当然Kotlin的语法糖直接简化为了activity

    //Fragment生命周期 onCreate
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //获取到承载的Activity对象
        val mainActivity= activity as MainActivity
        //调用其方法
        mainActivity.doSomething()
        //需要context时也可以
        Toast.makeText(activity,"fragment created",Toast.LENGTH_LONG).show()
    }

2.2 Activity中调用Fragment

Activity布局文件中加入fragment,并通过name来指定Fragment类名

    <fragment
        android:id="@+id/leftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:name="qiaodan.yu.firstlineofcodedemo.fragment.LeftFragment"
        />

Activity调用Fragment

        //方式一(已废弃)
        var fragment= fragmentManager.findFragmentById(R.id.leftFragment) as LeftFragment
        //简化的方式
        fragment=leftFragment as LeftFragment
        fragment.doSomething()

2.3 同一个Activity中Fragment互相调用

非常简单,还是通过Activity来传递:比如我在左边Fragment中调用右边的Fragment方法

        val mainActivity=activity as MainActivity
        mainActivity.rightFragment.doSomething()

三 Fragment的动态添加和加入返回栈

效果图: 效果图

动态修改通过FrameLayout来管理:
MainActivity布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    android:orientation="horizontal"
    tools:context=".activity.MainActivity">

    <fragment
        android:id="@+id/leftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:name="qiaodan.yu.firstlineofcodedemo.fragment.LeftFragment"
        />

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

</LinearLayout>

代码:

   override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.d("界面生命周期", "1---onCreate")
        Log.d("Task id", "$taskId")
        if (savedInstanceState != null) {
            val msg = savedInstanceState.getString("data_key")
        }
        leftFragmentBtn.setOnClickListener {
            replaceFragment(AnotherRightFragment())

        }
        replaceFragment(RightFragment())
    }

    private fun replaceFragment(fragment: Fragment) {
        val fragmentManager = supportFragmentManager
        val transaction = fragmentManager.beginTransaction()
        transaction.replace(R.id.rightFrameLayout, fragment)
        //加入返回栈
        transaction.addToBackStack(null)
        transaction.commit()
    }

四 Fragment生命周期

image.png

几乎和Activity一致,但是Fragment多了以下几个生命周期:
onAttach() 当Fragment和Activity建立关联时调用。

onCreateView() 为Fragment创建视图(加载布局)时调用。

onActivityCreated() 确保与Fragment相关联的Activity已经创建完毕时调用。

onDestroyView() 当与Fragment关联的视图被移除时调用。

onDetach() 当Fragment和Activity解除关联时调用。

五 动态加载布局技巧

就像是根据不同屏幕分辨率选择不同分辨率的图片一样,多张同名但你不同清晰度的图片放在不同的文件夹下:ldpi,mdpi, hdpi, xhdpi ,xxhdpi,使用什么由Android系统自行决定。
其实layout作为一种布局资源问价,也可以这样,在res下新建layout-large文件夹,创建同名的activity_main.xml,这样系统就可以根据不同屏幕大自动选择不同的布局文件了,当然我们也可以自己设置,究竟多大的屏幕为large P222

image.png
当然,也和图片一样,原本的layout作为默认,当large中没有布局时,采用默认的。

app的资源管理包括不同清晰度的图片,不同屏幕大小的布局,不同黑夜模式的颜色,不同语言环境的字符串等等,所有资源都应该有一个默认的,按规范创建好资源文件夹,系统根据环境自动选择,当对应环境的文件夹不存在某种资源时,就选择默认的。

相关文章

网友评论

      本文标题:《第一行代码》第五章 探究Fragment

      本文链接:https://www.haomeiwen.com/subject/yizbtktx.html