当前位置: 首页 > news >正文

第一行代码第五章读书笔记(1)Fragment

一、Fragment简单用法

1. 创建左边的Fragment

packagecom.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_PARAM1="param1"privateconstvalARG_PARAM2="param2"/** * 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{param1=it.getString(ARG_PARAM1)param2=it.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 parameters@JvmStaticfunnewInstance(param1:String,param2:String)=RightFragment().apply{arguments=Bundle().apply{putString(ARG_PARAM1,param1)putString(ARG_PARAM2,param2)}}}}

fragment_left

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="按钮"/></LinearLayout>

2. 创建右边的Fragment

packagecom.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_PARAM1="param1"privateconstvalARG_PARAM2="param2"/** * 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{param1=it.getString(ARG_PARAM1)param2=it.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 parameters@JvmStaticfunnewInstance(param1:String,param2:String)=RightFragment().apply{arguments=Bundle().apply{putString(ARG_PARAM1,param1)putString(ARG_PARAM2,param2)}}}}

fragment_right

<?xml version="1.0" encoding="utf-8"?><FrameLayoutxmlns: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=".RightFragment"><!-- TODO: Update blank fragment layout --><TextViewandroid:gravity="center_horizontal"android:layout_width="match_parent"android:layout_height="match_parent"android:text="@string/hello_blank_fragment"/></FrameLayout>

3. 创建显示Fragment的Activity

packagecom.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 version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><fragmentandroid:id="@+id/leftFragment"android:layout_width="0dp"android:layout_weight="1"android:name="com.example.myseven.LeftFragment"android:layout_height="match_parent"/><fragmentandroid:id="@+id/rightFragment"android:layout_width="0dp"android:layout_height="match_parent"android:name="com.example.myseven.RightFragment"android:layout_weight="1"/></LinearLayout>

4. 运行结果

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)
http://www.zskr.cn/news/1512229.html

相关文章:

  • 2624张标准化EL灰度图,覆盖隐裂/断栅/污渍等光伏电池片常见缺陷
  • ncmdumpGUI:终极NCM格式转换方案,让网易云音乐真正属于你
  • 5步轻松上手:Arduino ESP32开发环境搭建完全指南
  • AI Skill 技术架构设计
  • Rust 1.75.0升级后,别忘了用这5个新特性检查你的项目
  • S32G GoldVIP车载网关平台:异构计算、SOA与云边协同实战解析
  • Adobe-GenP 3.0实战指南:5分钟解锁Adobe全系列专业软件
  • 从RGB颜色提取到大小端转换:聊聊移位操作那些意想不到的实用场景
  • 2026青岛除甲醛行业深度报告:市场规模与品牌竞争力 - 环保除醛知识库
  • 员工培训考试系统选型指南 - 资讯焦点
  • HAL层使用sensor2.0,kernel使用sensor AP侧驱动
  • 免费解锁B站4K高清视频下载:Python开源工具终极指南
  • 有哪些会员是每周都能免费领奖品的,不需要抽奖那种?美团会员无套路周领福利全指南 - 资讯焦点
  • 2026海口黄金回收价格解析 靠谱门店逐一盘点 - 余生黄金回收
  • 2026惠州黄金回收门店实测 避坑与商家推荐 - 余生黄金回收
  • 如何快速掌握Kemono下载器:面向新手的Windows批量下载完全指南
  • AI开发必备!Oumi开源平台:一键搞定模型训练到部署,零代码上手大模型!
  • DSP56853 B2版硬件勘误深度解析与软件规避实战指南
  • 如何用自然语言对话完成专业数据分析:PandasAI终极指南
  • 人才盘点系统选型全流程:SaaS和定制化系统怎么选 - 资讯焦点
  • 如何通过智能批量查询工具高效管理多个Excel文件
  • 惠州黄金回收价格解析 2026正规门店全梳理 - 余生黄金回收
  • 从‘一个像素’到‘全场清晰’:拆解并行单像素成像,看它如何成为工业质检的‘火眼金睛’
  • 2026年成都服装推荐方案 - 谁都没有我好看
  • 想通过会员每周免费领福利,哪些平台真的有这种活动?2026亲测靠谱平台首推它 - 资讯焦点
  • 从IFA到PIFA:为什么你的蓝牙耳机和手机都用这种“平面”天线?
  • 终极游戏文件解包神器:QuickBMS完整使用指南
  • 2026年美国留学中介性价比对比:五家优选品牌深度解析 - 科技焦点
  • 2026绍兴新房除甲醛方法对比:实测排名与科学推荐方案 - 环保除醛知识库
  • 广州闲置包包变现白皮书|门店优劣拆解+避坑实操技巧 - 奢侈品回收评测