Android 第四十二章 Fragment

发布于:2024-05-08 ⋅ 阅读:(20) ⋅ 点赞:(0)

一、简介

Fragment(碎片) 主要用于对Activity UI 模块化,依托Activity存在,当Activity销毁时,Fragment随之销毁

二、生命周期

onAttach() Fragment和Activity 绑定
onCreate() 初始化
onCreateView() 创建视图
onActivityCreated() Activity 已初始化完成
onStart() 界面可见
onResume() 获得焦点
onPause() 失去焦点
onStop() 停止 界面不可见
onDestroyView() 销毁视图
onDestroy() 销毁
onDetach() 取消绑定

三、实例

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private lateinit var bf: BlankFragment
    private lateinit var wf: WhiteFragment
    private lateinit var ft: FragmentTransaction

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        init()
    }

    private fun init() {
        initFragment()
        initClick()
    }

    private fun initFragment() {
        ft = supportFragmentManager.beginTransaction()

        bf = BlankFragment()
        val bundle = Bundle()
        bundle.putString("blank", "人什么时候才会死?被子弹贯穿心脏的时候?不对!得了不治之症的时候?不对!喝下毒蘑菇汤的时候?不对!是被人遗忘的时候!")
        bf.arguments = bundle
        ft.add(R.id.fl_content, bf)

        wf = WhiteFragment()
        val b = Bundle()
        b.putString("white", "测试")
        wf.arguments = b
        ft.add(R.id.fl_content, wf)

        hideFragment(ft)
        ft.show(bf)
        ft.commit()
    }


    //隐藏所有fragment
    private fun hideFragment(ft: FragmentTransaction) {
        ft.hide(bf)
        ft.hide(wf)
    }

    private fun initClick() {
        bf.setResultListener(object : BlankFragment.FragmentResult_Listener {
            override fun Fragment_DataEvent(content: String) {
                Log.d("mainActivity", content)
            }
        })

        binding.btnBf.setOnClickListener {
            ft = supportFragmentManager.beginTransaction()
            hideFragment(ft)
            ft.show(bf)
            ft.commit()
        }
        binding.btnWf.setOnClickListener {
            ft = supportFragmentManager.beginTransaction()
            hideFragment(ft)
            ft.show(wf)
            ft.commit()
        }
    }
}
<?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="vertical"
    tools:context=".MainActivity">

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

    </FrameLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:orientation="horizontal"
        android:paddingHorizontal="30dp">

        <Button
            android:id="@+id/btn_bf"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="blank"
            android:textSize="16sp"
            android:textAllCaps="false" />

        <Button
            android:id="@+id/btn_wf"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginLeft="30dp"
            android:layout_weight="1"
            android:textSize="16sp"
            android:text="white"
            android:textAllCaps="false" />
    </LinearLayout>
</LinearLayout>
class BlankFragment : Fragment() {

    private lateinit var binding: FragmentBlankBinding

    private lateinit var listener: FragmentResult_Listener

    private var activityData: String = ""

    //绑定
    override fun onAttach(context: Context) {
        super.onAttach(context)
        Log.d("fragment——", "onAttach")
    }

    //初始化
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            activityData = it.getString("blank").toString()
            Log.d("BlankFragment", "$activityData")

        }
        Log.d("fragment——", "onCreate")
    }

    //创建视图
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        binding = FragmentBlankBinding.inflate(inflater, container, false)

        Log.d("fragment——", "onCreateView")

        initClick()

        return binding.root
    }

    private fun initClick() {
        binding.btnTest.setOnClickListener {
            listener.let {
                listener.Fragment_DataEvent("测试")
            }

        }
    }

    //Activity 已初始化完成
    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        Log.d("fragment——", "onActivityCreated")
    }

    //界面可见
    override fun onStart() {
        super.onStart()
        Log.d("fragment——", "onStart")
    }

    //获得焦点
    override fun onResume() {
        super.onResume()
        Log.d("fragment——", "onResume")
    }

    //失去焦点
    override fun onPause() {
        super.onPause()
        Log.d("fragment——", "onPause")
    }

    //停止 界面不可见
    override fun onStop() {
        super.onStop()
        Log.d("fragment——", "onStop")
    }

    //销毁视图
    override fun onDestroyView() {
        super.onDestroyView()
        Log.d("fragment——", "onDestroyView")
    }

    //销毁
    override fun onDestroy() {
        super.onDestroy()
        Log.d("fragment——", "onDestroy")
    }

    //取消绑定
    override fun onDetach() {
        super.onDetach()
        Log.d("fragment——", "onDetach")
    }

    public fun setResultListener(listener: FragmentResult_Listener) {
        this.listener = listener
    }


    interface FragmentResult_Listener {
        fun Fragment_DataEvent(content: String)
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".BlankFragment">

    <Button
        android:id="@+id/btn_test"
        android:layout_width="300dp"
        android:layout_height="60dp"
        android:text="测试"
        android:textSize="30sp" />

</LinearLayout>
class WhiteFragment : Fragment() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            val data = it.getString("white")
            Log.d("whiteFragment", "$data")
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_white, container, false)
    }
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".WhiteFragment">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="test" />

</FrameLayout>