浅谈 Fragment

fragment 用户界面管理上用到的地方非常多,fragment 相比 activity ,不同的activity之间有很强的过多效果,fragment 更加轻量级的转变,更加灵活,Fragment 也称作UI Fragment。一下我们通过几个问题来介绍 Fragment。


为什么要使用Fragment,能实现什么?

在实际的开发中,虽然 Activity 可以帮助我们实现不同的页面承载,但是要遵循 Activity 的生命周期,当我们要实现更友好的用户界面,Activity 已经不能满足我们。Fragment 提供更灵活的 UI设计需求,fragment 是一种控制器对象,activity可以委派它完成一些任务,通常是管理用户界面,受管理的用户界面通常是一整屏或是屏幕的一部分。在一些需要在一个activity 进行不同操作的情况下,fragment 就能提供很好的交互。

Fragment 与 Activity 的什么关系?

Fragment 必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期,通过两者的生命周期图来理解,fragment



onAttach()
当Fragment与Activity发生关联时调用。
onCreateView()
创建该Fragment的视图
onActivityCreated(Bundle)
当Activity的onCreate方法返回时调用
onDestoryView()
与onCreateView想对应,当该Fragment的视图被移除时调用
onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用

注意:没说的代表跟 activity 相同

如何使用 Fragment?

两种方式

  • 布局的方式
  • 代码的方式
(一) 布局的方式

<Fragment android:name="在布局中实例化的Fragment 的包名"></Fragement>

当系统构建 Activity 布局时,会实例化在布局指定的 fragment ,并调用 onCreateView()方法。系统会直接插入onCreateView()中返回的 view 来代替<fragment> 标签

注:每个fragment都需要一个唯一的标识符,重启 Activity 时,系统可以使用该标识符来恢复fragment(您也可以使用该标识符来捕获fragment以执行某些事务,如将其移除)。 可以通过三种方式为片段提供 ID:
为 android:id 属性提供唯一 ID。
为 android:tag 属性提供唯一字符串。
如果您未给以上两个属性提供值,系统会使用容器视图的 ID。
对于 Fragment 的理解----------------------------------------------------------------------官方文档

(二)代码的方式

在Activity 运行的过程中,再添加Fragment到指定的ViewGroup
需要通过 FragmentManager 来管理(添加,删除,替换)事务的管理

getSupportFragmentManager().beginTrasaction()
.add(R.id.fragment,fragment)
// 参数1. 指定位置添加,通过资源ID定位
// 参数2.需要添加的 fragment
如果需要 addToBackStack() 将此事务添加到事务返回栈,允许用户按返回键返回上一个 Fragment 状态
.commit
一旦通过FragmentTransaction做出修改必须 commit() 进行提交 才能生效

提示:对于每个片段事务,您都可以通过在提交前调用 setTransition()
来应用过渡动画。

添加没有 UI 的片段
上例展示了如何向您的 Activity 添加片段以提供 UI。不过,您还可以使用片段为 Activity 提供后台行为,而不显示额外 UI。
要想添加没有 UI 的片段,请使用 add(Fragment, String)
从 Activity 添加片段(为片段提供一个唯一的字符串“标记”,而不是视图 ID)。 这会添加片段,但由于它并不与 Activity 布局中的视图关联,因此不会收到对 onCreateView()
的调用。因此,您不需要实现该方法。
并非只能为非 UI 片段提供字符串标记 — 您也可以为具有 UI 的片段提供字符串标记 — 但如果片段没有 UI,则字符串标记将是标识它的唯一方式。如果您想稍后从 Activity 中获取片段,则需要使用 findFragmentByTag()

onCreateView
  inflater,inflate(R.layout.id,container,false);
参数 1.需要填充的布局,
参数 2.填充的布局显示到父ViewGroup
参数 3.指示是否应该在扩展期间将扩展布局附加至(第二个参数)的布尔值。
在本例中,其值为 false,因为系统已经将扩展布局插入 
container传递 true 值会在最终布局中创建一个多余的视图组。
Fragment 事务该如何理解?

理解 :每一个继承 Fragment 的类都有与之对应的 XML 视图,这是跟 Activity 相同的地方 ,这个 XML 视图 可以看成一个动态的视图,这个视图跟主视图绑定,当我们进行交互性操作的时候,FragmentManager 管理 fragment 事务 进行添加,移除,替换 ,这个过程中遵循的是 fragment 的生命周期,只要 Activity 处于运行状态,就可以使用一个或者多个fragment 进行 事务的处理。例如:清单列表和详细内容是两个不同的 fragment 构成,先加载的是清单列表 fragment 当用户选中其中一个,触发FragmentManager 进行 替换操作,替换成详细内容fragment。

结束语

fragment 的用法还有许多,包括与ViewPager 和 FragmentPagerAdapter 的使用这里我们先介绍基础性的知识,也没有给大家介绍具体的代码,因为我认为对于这个东西,先要去理解它,当你再去看代码就能很好的使用了。

期末大作业基于python的足球运动员数据分析源码+数据集(高分项目),个人经导师指导并认可通过的高分设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业、毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于pyth
<think>好的,我现在需要帮助用户了解如何使用Android DataBinding。根据用户提供的引用内容,我需要整理一个结构清晰的教程。首先,我要确定DataBinding的基本配置步骤,因为这是开始使用的前提。然后,布局文件的修改是关键,需要解释如何将传统布局转换为DataBinding支持的格式。接下来,数据绑定的部分,用户可能需要知道如何创建数据模型并将其与UI绑定,引用中的User类示例和BindingAdapter的使用都是重点。此外,用户可能对在Activity和Fragment中的不同用法感兴趣,比如在Activity中使用DataBindingUtil.setContentView,而在Fragment中使用inflate方法。我还需要提到数据绑定的优势,比如减少样板代码,以及处理复杂数据的方法,比如使用@BindingAdapter自定义属性。最后,生成相关问题可以帮助用户深入理解,比如性能优化或与LiveData的结合。需要确保所有步骤都符合引用内容,并且语法正确,使用中文回答,行内公式用$...$,独立公式用$$...$$,不过在这个问题中可能公式较少,但要注意LaTeX的正确使用。检查是否有遗漏的步骤,例如启用DataBinding的Gradle配置,绑定变量的设置,以及事件处理的方法。确保每个部分都有对应的引用标注,比如在Activity和Fragment中的用法分别引用[^2]和[^1]。最后,生成的相关问题要覆盖用户可能感兴趣的扩展方向,如性能、优化、应用场景等。</think>### Android DataBinding 使用教程 #### 1. **启用DataBinding** 在模块的$build.gradle$文件中添加配置: ```groovy android { ... dataBinding { enabled = true } } ``` 同步项目后,系统会自动生成与布局文件对应的绑定类。 #### 2. **修改布局文件** 将传统XML转换为DataBinding格式: ```xml <!-- activity_main.xml --> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.example.User" /> </data> <LinearLayout...> <TextView android:text="@{user.name}" // 直接绑定变量 .../> <ImageView app:imageUrl="@{user.avatarUrl}" // 自定义属性绑定 .../> </LinearLayout> </layout> ``` 布局根标签需改为$<layout>$,并通过$<data>$定义变量[^3]。 #### 3. **数据绑定实现** - **数据模型类**(例如$User$)需使用可观察机制(如$BaseObservable$或$LiveData$): ```java public class User extends BaseObservable { private String name; @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(BR.name); // 触发UI更新 } } ``` - **在Activity中绑定数据**: ```java ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); User user = new User(); user.setName("John Doe"); binding.setUser(user); // 关键绑定语句 ``` - **在Fragment/Adapter中使用**: ```java ListItemBinding binding = DataBindingUtil.inflate( LayoutInflater.from(context), R.layout.list_item, parent, false ); binding.setVariable(BR.item, dataItem); // BR.item对应布局中定义的变量名[^1] ``` #### 4. **处理复杂绑定** - **自定义属性**:通过$@BindingAdapter$实现网络图片加载等逻辑: ```java @BindingAdapter("imageUrl") public static void bindImageUrl(ImageView view, String url) { Glide.with(view).load(url).into(view); // 使用第三方库加载图片[^4] } ``` - **事件绑定**:在布局中直接绑定点击事件: ```xml <Button android:onClick="@{() -> viewModel.onButtonClick()}" .../> ``` #### 5. **优势与注意事项** - **优势**:减少$findViewById$调用,UI更新自动化,代码可读性提升[^3] - **注意**:避免在布局中编写复杂逻辑,建议与ViewModel或Presenter模式结合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值