android 中 fragment 的使用指南
fragment 是 android 应用开发中的重要组件,它代表 activity 中的一部分 ui 或行为,可以组合多个 fragment 在一个 activity 中构建多窗格 ui,并在不同 activity 中重复使用某个 fragment。
基本概念
fragment 具有自己的生命周期,但依赖于宿主 activity 的生命周期。每个 fragment 都有自己的布局和行为。
创建 fragment
1. 定义 fragment 类
public class myfragment extends fragment {
@override
public view oncreateview(layoutinflater inflater, viewgroup container,
bundle savedinstancestate) {
// 膨胀 fragment 的布局
return inflater.inflate(r.layout.fragment_my, container, false);
}
@override
public void onviewcreated(@nonnull view view, @nullable bundle savedinstancestate) {
super.onviewcreated(view, savedinstancestate);
// 在这里初始化视图和逻辑
}
}2. 创建 fragment 的布局文件 (res/layout/fragment_my.xml)
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<textview
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello fragment!" />
</linearlayout>添加 fragment 到 activity
方式1: 在 xml 布局中添加 (静态方式,不推荐)
<!-- activity_main.xml -->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/myfragment"
android:name="com.example.myfragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</linearlayout>方式2: 在代码中动态添加 (推荐)
public class mainactivity extends appcompatactivity {
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
// 检查是否已经添加了fragment(防止旋转时重复添加)
if (savedinstancestate == null) {
// 创建fragment实例
myfragment fragment = new myfragment();
// 开始fragment事务
getsupportfragmentmanager().begintransaction()
.add(r.id.fragment_container, fragment) // 添加到容器
.commit();
}
}
}对应的 activity_main.xml 需要有一个容器:
<framelayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />fragment 事务
可以执行添加、移除、替换等操作:
// 替换fragment
getsupportfragmentmanager().begintransaction()
.replace(r.id.fragment_container, new anotherfragment())
.addtobackstack(null) // 允许用户按返回键返回上一个fragment
.commit();fragment 生命周期
fragment 的生命周期方法:
- onattach() - fragment 与 activity 关联时调用
- oncreate() - fragment 创建时调用
- oncreateview() - 创建 fragment 的视图层次结构
- onactivitycreated() - activity 的 oncreate() 完成后调用
- onstart() - fragment 可见时调用
- onresume() - fragment 可交互时调用
- onpause() - fragment 不再可交互时调用
- onstop() - fragment 不可见时调用
- ondestroyview() - fragment 的视图被移除时调用
- ondestroy() - fragment 不再使用时调用
- ondetach() - fragment 与 activity 解除关联时调用
fragment 与 activity 通信
1. fragment 调用 activity 方法
// 在fragment中
if (getactivity() instanceof myactivityinterface) {
((myactivityinterface) getactivity()).dosomething();
}
// activity实现接口
public interface myactivityinterface {
void dosomething();
}2. activity 调用 fragment 方法
myfragment fragment = (myfragment) getsupportfragmentmanager()
.findfragmentbyid(r.id.my_fragment);
if (fragment != null) {
fragment.dosomethinginfragment();
}3. 使用 viewmodel 共享数据 (推荐)
// 创建共享viewmodel
public class sharedviewmodel extends viewmodel {
private final mutablelivedata<string> selected = new mutablelivedata<>();
public void select(string item) {
selected.setvalue(item);
}
public livedata<string> getselected() {
return selected;
}
}
// 在activity或fragment中获取
sharedviewmodel model = new viewmodelprovider(requireactivity()).get(sharedviewmodel.class);
model.getselected().observe(this, item -> {
// 更新ui
});最佳实践
- 使用
androidx.fragment.app包中的 fragment(支持库版本) - 避免在 fragment 中直接持有 activity 的引用
- 使用接口进行 fragment 与 activity 的通信
- 考虑使用 viewmodel 和 livedata 进行数据共享
- 合理使用
addtobackstack()管理返回栈 - 为 fragment 添加标签,便于查找:
.add(r.id.container, fragment, "tag")
高级用法
1. fragment 参数传递
// 创建fragment时传递参数
public static myfragment newinstance(string param) {
myfragment fragment = new myfragment();
bundle args = new bundle();
args.putstring("key", param);
fragment.setarguments(args);
return fragment;
}
// 在fragment中获取参数
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
if (getarguments() != null) {
string param = getarguments().getstring("key");
}
}2. 使用 navigation 组件管理 fragment
// 在build.gradle中添加依赖 implementation "androidx.navigation:navigation-fragment:2.3.5" // 使用navcontroller导航 navcontroller navcontroller = navigation.findnavcontroller(view); navcontroller.navigate(r.id.action_to_next_fragment);
到此这篇关于android fragment 的使用小结的文章就介绍到这了,更多相关android fragment 使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论