当前位置: 首页 > 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.jsqmd.com/news/1000457/

相关文章:

  • Flowable工作流别再直接查act表了!手把手教你设计一张高性能待办已办表
  • 济宁黄金回收避坑干货|正规回收4大标准一看就懂 - 余生黄金回收
  • 2026 厦门包包正规回收:中检鉴定,透明报价 - 奢侈品回收评测
  • Ant Design 6.4.4 发布:多组件问题修复,国际化与 TypeScript 功能优化
  • League Akari:英雄联盟客户端自动化工具箱实战指南
  • AAL90脑区映射可视化工具:用Python把MEG功能数据精准贴到个体大脑表面网格上
  • 现在各平台会员哪个每周都有实质性免费活动,不是优惠券那种?实测美团会员权益最实在 - 资讯焦点
  • ncmdumpGUI:终极NCM格式转换方案,让网易云音乐真正属于你
  • 2624张标准化EL灰度图,覆盖隐裂/断栅/污渍等光伏电池片常见缺陷
  • 人人都能理解的机器学习:从超市补货到错题本的认知重建
  • 2026年 东北600*600防静电地板供应厂家:稳定抗静电、精密机房与数据中心首选品牌解析 - 企业推荐官【官方】
  • 2026年6月最新评测丨三亚目的地婚礼品牌排行更新洗牌!浅山四项突出 - 天天生活分享日志
  • Java性能优化全栈小册(2026突击版)
  • 济南闲置黄金变现指南 2026正规回收店全解析 - 余生黄金回收
  • NXP 56F8123混合信号控制器:MCU与DSP融合的工业控制核心
  • AI Skill 技术架构设计
  • CNCF 项目 Inspektor Gadget 完成首次安全审计,3 个漏洞已修复并给出 6 条加固建议
  • 5步轻松上手:Arduino ESP32开发环境搭建完全指南
  • 各平台会员免费领取的权益相比,哪个实物或体验价值更高?2026最新实测结果来了 - 资讯焦点
  • VidDown 工具站:视频分辨率技术
  • 2026太原除甲醛避坑全指南:供暖季甲醛治理与陷阱揭秘 - 环保除醛知识库
  • Rust 1.75.0升级后,别忘了用这5个新特性检查你的项目
  • python笔记和练习----少儿编程课程【阶段一(二)】
  • 华为MH5000-31 5G模组Windows调试驱动(2020.03版,含V711/V722环境支持)
  • S32G GoldVIP车载网关平台:异构计算、SOA与云边协同实战解析
  • 超低功耗MCU集成LCD驱动:MC9S08LL16架构解析与低功耗设计实战
  • Adobe-GenP 3.0实战指南:5分钟解锁Adobe全系列专业软件
  • 2026甄选:东北机房防静电地板厂家锦峰装饰材料专业防潮抗冻与施工服务深度解析 - 企业推荐官【官方】
  • 2026年小型气流粉碎机哪家质量好?专业生产厂家实力对比指南 - 品牌推荐大师
  • 别再盲目试了!2026亲测靠谱的AI论文网站|省心版