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

Android: Fragment 的使用指南

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 的生命周期方法:

  1. onAttach() - Fragment 与 Activity 关联时调用
  2. onCreate() - Fragment 创建时调用
  3. onCreateView() - 创建 Fragment 的视图层次结构
  4. onActivityCreated() - Activity 的 onCreate() 完成后调用
  5. onStart() - Fragment 可见时调用
  6. onResume() - Fragment 可交互时调用
  7. onPause() - Fragment 不再可交互时调用
  8. onStop() - Fragment 不可见时调用
  9. onDestroyView() - Fragment 的视图被移除时调用
  10. onDestroy() - Fragment 不再使用时调用
  11. 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
});

最佳实践

  1. 使用 androidx.fragment.app 包中的 Fragment(支持库版本)
  2. 避免在 Fragment 中直接持有 Activity 的引用
  3. 使用接口进行 Fragment 与 Activity 的通信
  4. 考虑使用 ViewModel 和 LiveData 进行数据共享
  5. 合理使用 addToBackStack() 管理返回栈
  6. 为 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);

相关文章:

  • 004 健身房个性化训练计划——金丹期(体态改善)
  • 汇编学习之《数据传输指令》
  • 远程装个Jupyter-AI协作笔记本,Jupyter容器镜像版本怎么选?安装部署教程
  • Rust 语言语法糖深度解析:优雅背后的编译器魔法
  • VoIP技术及其与UDP的关系详解
  • 五类线和六类线
  • 洛谷: P1825 [USACO11OPEN] Corn Maze S
  • 揭秘:父子组件之间的传递
  • Redis批量操作详解
  • Scala的基本语法(二)
  • Python第七章03:文件写入操作
  • JS判断对象是否为空的方法
  • 移动端六大语言速记:第4部分 - 数据结构
  • Linux环境下Ollama升级及Gemma3模型部署指南
  • 突发,国行 iPhone 17,支持 eSIM
  • C# 事件(Event)
  • 【Linux】Linux 系统启动流程详解
  • 深入理解 POSIX 线程 (pthread):从基础到高级应用
  • 3-栈、队列、数组
  • AIGC(生成式AI)试用 29 -- 用AI写读书笔记
  • php动态网站开发难吗/站长之家权重查询
  • 网站开发工具有/百度推广客户端
  • wordpress post结构/长春网站优化咨询
  • 怎样解除拦截网站设置/站长工具查询网
  • 茶叶网站策划方案/站长工具在线查询
  • 我的世界充值网站怎么做/seo平台有哪些