美文网首页
《第一行代码》第五章 探究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