第一行代码第五章读书笔记(1)Fragment
一、Fragment简单用法1. 创建左边的Fragmentpackagecom.example.mysevenimportandroid.os.Bundleimportandroidx.fragment.app.Fragmentimportandroid.view.LayoutInflaterimportandroid.view.Viewimportandroid.view.ViewGroup// TODO: Rename parameter arguments, choose names that match// the fragment initialization parameters, e.g. ARG_ITEM_NUMBERprivateconstvalARG_PARAM1param1privateconstvalARG_PARAM2param2/** * A simple [Fragment] subclass. * Use the [LeftFragment.newInstance] factory method to * create an instance of this fragment. */classLeftFragment:Fragment(){// TODO: Rename and change types of parametersprivatevarparam1:String?nullprivatevarparam2:String?nulloverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)arguments?.let{param1it.getString(ARG_PARAM1)param2it.getString(ARG_PARAM2)}}overridefunonCreateView(inflater:LayoutInflater,container:ViewGroup?,savedInstanceState:Bundle?):View?{// Inflate the layout for this fragmentreturninflater.inflate(R.layout.fragment_left,container,false)}companionobject{/** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * param param1 Parameter 1. * param param2 Parameter 2. * return A new instance of fragment RightFragment. */// TODO: Rename and change types and number of parametersJvmStaticfunnewInstance(param1:String,param2:String)RightFragment().apply{argumentsBundle().apply{putString(ARG_PARAM1,param1)putString(ARG_PARAM2,param2)}}}}fragment_left?xml version1.0 encodingutf-8?LinearLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidandroid:orientationverticalandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentButtonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_gravitycenterandroid:text按钮//LinearLayout2. 创建右边的Fragmentpackagecom.example.mysevenimportandroid.os.Bundleimportandroidx.fragment.app.Fragmentimportandroid.view.LayoutInflaterimportandroid.view.Viewimportandroid.view.ViewGroup// TODO: Rename parameter arguments, choose names that match// the fragment initialization parameters, e.g. ARG_ITEM_NUMBERprivateconstvalARG_PARAM1param1privateconstvalARG_PARAM2param2/** * A simple [Fragment] subclass. * Use the [RightFragment.newInstance] factory method to * create an instance of this fragment. */classRightFragment:Fragment(){// TODO: Rename and change types of parametersprivatevarparam1:String?nullprivatevarparam2:String?nulloverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)arguments?.let{param1it.getString(ARG_PARAM1)param2it.getString(ARG_PARAM2)}}overridefunonCreateView(inflater:LayoutInflater,container:ViewGroup?,savedInstanceState:Bundle?):View?{// Inflate the layout for this fragmentreturninflater.inflate(R.layout.fragment_right,container,false)}companionobject{/** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * param param1 Parameter 1. * param param2 Parameter 2. * return A new instance of fragment RightFragment. */// TODO: Rename and change types and number of parametersJvmStaticfunnewInstance(param1:String,param2:String)RightFragment().apply{argumentsBundle().apply{putString(ARG_PARAM1,param1)putString(ARG_PARAM2,param2)}}}}fragment_right?xml version1.0 encodingutf-8?FrameLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.RightFragment!-- TODO: Update blank fragment layout --TextViewandroid:gravitycenter_horizontalandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:textstring/hello_blank_fragment//FrameLayout3. 创建显示Fragment的Activitypackagecom.example.mysevenimportandroid.os.Bundleimportandroidx.activity.ComponentActivityimportandroidx.activity.compose.setContentimportandroidx.activity.enableEdgeToEdgeimportandroidx.compose.foundation.layout.fillMaxSizeimportandroidx.compose.foundation.layout.paddingimportandroidx.compose.material3.Scaffoldimportandroidx.compose.material3.Textimportandroidx.compose.runtime.Composableimportandroidx.compose.ui.Modifierimportandroidx.compose.ui.tooling.preview.Previewimportandroidx.fragment.app.FragmentActivityimportcom.example.myseven.ui.theme.MySevenThemeclassMainActivity:FragmentActivity(){overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)}}activity_main?xml version1.0 encodingutf-8?LinearLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidandroid:orientationhorizontalandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentfragmentandroid:idid/leftFragmentandroid:layout_width0dpandroid:layout_weight1android:namecom.example.myseven.LeftFragmentandroid:layout_heightmatch_parent/fragmentandroid:idid/rightFragmentandroid:layout_width0dpandroid:layout_heightmatch_parentandroid:namecom.example.myseven.RightFragmentandroid:layout_weight1//LinearLayout4. 运行结果5. 注意事项activity_main 中的fragment要添加id否则就会报错Caused by: java.lang.IllegalArgumentException: Binary XML file line #10: Must specify unique android:id, android:tag, or have a parent with an id for com.example.myseven.LeftFragment at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:77) at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:136) at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:247) at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:226) at android.view.LayoutInflater.tryCreateView(LayoutInflater.java:958) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:886) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:850) at android.view.LayoutInflater.rInflate(LayoutInflater.java:1012) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:973) at android.view.LayoutInflater.inflate(LayoutInflater.java:571) at android.view.LayoutInflater.inflate(LayoutInflater.java:462) at android.view.LayoutInflater.inflate(LayoutInflater.java:413) at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:577) at android.app.Activity.setContentView(Activity.java:3892) at androidx.activity.ComponentActivity.setContentView(ComponentActivity.java:440) at com.example.myseven.MainActivity.onCreate(MainActivity.kt:20) at android.app.Activity.performCreate(Activity.java:9155) at android.app.Activity.performCreate(Activity.java:9133) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1521) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4262) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4467) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:222) at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:133) at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:103) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:80) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2823)MainActivity要继承FragmentActivity否则会报如下错误Causedby:android.app.Fragment$InstantiationException:Tryingtoinstantiateaclasscom.example.myseven.LeftFragmentthat is not aFragmentatandroid.app.Fragment.instantiate(Fragment.java:543)atandroid.app.FragmentContainer.instantiate(FragmentContainer.java:53)atandroid.app.FragmentManagerImpl.onCreateView(FragmentManager.java:3553)atandroid.app.FragmentController.onCreateView(FragmentController.java:105)atandroid.app.Activity.onCreateView(Activity.java:8196)atandroid.view.LayoutInflater.tryCreateView(LayoutInflater.java:958)atandroid.view.LayoutInflater.createViewFromTag(LayoutInflater.java:886)atandroid.view.LayoutInflater.createViewFromTag(LayoutInflater.java:850)atandroid.view.LayoutInflater.rInflate(LayoutInflater.java:1012)atandroid.view.LayoutInflater.rInflateChildren(LayoutInflater.java:973)atandroid.view.LayoutInflater.inflate(LayoutInflater.java:571)atandroid.view.LayoutInflater.inflate(LayoutInflater.java:462)atandroid.view.LayoutInflater.inflate(LayoutInflater.java:413)atcom.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:577)atandroid.app.Activity.setContentView(Activity.java:3892)atandroidx.activity.ComponentActivity.setContentView(ComponentActivity.java:440)atcom.example.myseven.MainActivity.onCreate(MainActivity.kt:20)atandroid.app.Activity.performCreate(Activity.java:9155)atandroid.app.Activity.performCreate(Activity.java:9133)atandroid.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1521)atandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:4262)atandroid.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4467)atandroid.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:222)atandroid.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:133)atandroid.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:103)atandroid.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:80)atandroid.app.ActivityThread$H.handleMessage(ActivityThread.java:2823)atandroid.os.Handler.dispatchMessage(Handler.java:110)