Android Fragment 的使用小结

 更新时间:2025年04月03日 10:53:03   作者:沪cares  
Fragment是Android 应用开发中的重要组件,它代表 Activity 中的一部分 UI 或行为,可以组合多个 Fragment 在一个 Activity 中构建多窗格 UI,并在不同 Activity 中重复使用某个 Fragment,本文给大家介绍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 的生命周期方法:

  • 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 使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android剪贴板用法详解

    Android剪贴板用法详解

    这篇文章主要介绍了Android剪贴板用法详解,以实例的形式对Android中剪贴板的各类传值方法做了较为详细的讲述,需要的朋友可以参考下
    2014-10-10
  • Volley源码之使用方式和使用场景详解

    Volley源码之使用方式和使用场景详解

    这篇文章主要介绍了Volley源码之使用方式和使用场景详解,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Android 文件选择器详解及实例代码

    Android 文件选择器详解及实例代码

    这篇文章主要介绍了Android 文件选择器详解的相关资料,并附实例代码,需要的朋友可以参考下
    2016-10-10
  • Android编程之EditText常见操作示例

    Android编程之EditText常见操作示例

    这篇文章主要介绍了Android编程之EditText常见操作,结合实例形式分析了Android EditText光标与文本操作相关技巧,需要的朋友可以参考下
    2017-03-03
  • 完美解决Jpush[获取sdk版本失败!]的问题

    完美解决Jpush[获取sdk版本失败!]的问题

    下面小编就为大家带来一篇完美解决Jpush[获取sdk版本失败!]的问题的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Android中webview与JS交互、互调方法实例详解

    Android中webview与JS交互、互调方法实例详解

    这篇文章主要介绍了Android中webview与JS交互、互调方法实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • Android添加音频的几种方法

    Android添加音频的几种方法

    今天小编就为大家分享一篇关于Android添加音频的几种方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Android实现ListView数据动态加载的方法

    Android实现ListView数据动态加载的方法

    这篇文章主要介绍了Android实现ListView数据动态加载的方法,通过ListView控件绑定setOnScrollListener方法简单实现动态加载数据的功能,需要的朋友可以参考下
    2016-01-01
  • Android中实现在矩形框中输入文字显示剩余字数的功能

    Android中实现在矩形框中输入文字显示剩余字数的功能

    在矩形输入框框中输入文字显示剩余字数的功能在app开发中经常会见到,今天小编就通过实例代码给大家分享android实现输入框提示剩余字数功能,代码简单易懂,需要的朋友参考下吧
    2017-04-04
  • 浅析Android.mk

    浅析Android.mk

    Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名、引用的头文件目录、需要编译的.c/.cpp文件和.a静态库文件等。要掌握jni,就必须熟练掌握Android.mk的语法规范
    2016-01-01

最新评论