Android基础之Fragment与Activity交互详解

yizhihongxing

Android基础之Fragment与Activity交互详解

背景介绍

在Android开发中,Activity是一个很常见且基础的组件,它可以被看作是应用程序中的一个窗口,用户与应用程序交互时,所看到的实际上就是Activity的内容。而Fragment是在Android 3.0之后才引入的,它可以被看作是Activity中的一个子页面,和Activity一样也有生命周期和界面布局等特征。

在实际开发中,我们常常会遇到需要Fragment和Activity之间相互通信的情况,比如Fragment向Activity传递数据,Activity向Fragment传递数据等。因此,本文主要介绍如何实现Fragment与Activity相互通信,包括以下内容:

  • Fragment与Activity的交互方式
  • 实现Fragment向Activity传递数据
  • 实现Activity向Fragment传递数据
  • 示例说明

Fragment与Activity的交互方式

Fragment可以通过Activity提供的getActivity()方法获取到其所在的Activity对象,从而进行Activity与Fragment之间的交互。Activity可以通过FragmentManager获取到管理Fragment的FragmentTransaction(事务),通过FragmentTransaction的add、replace、remove等方法来管理Fragment的添加、删除、替换等操作。

实现Fragment向Activity传递数据

在Fragment中,通过getActivity()方法获取到所在的Activity对象后,通过向Activity发送数据的方式实现与Activity的交互。具体实现方式如下:

1.在Fragment中定义一个监听接口

public interface OnFragmentInteractionListener {
    void onFragmentInteraction(String data);
}

2.在Fragment中定义一个成员变量,用于保存向Activity传递数据的监听器

private OnFragmentInteractionListener mListener;

3.在Fragment中调用onAttach()方法,将Activity转换成监听器对象,并保存到成员变量中

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

4.在Fragment中调用onDetach()方法,将监听器对象清空

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}

5.在Fragment中调用监听器对象的接口方法向Activity传递数据

if (mListener != null) {
    mListener.onFragmentInteraction("hello");
}

6.在Activity中实现OnFragmentInteractionListener接口,并重写其接口方法以实现对Fragment传递数据的处理逻辑

@Override
public void onFragmentInteraction(String data) {
    // 处理Fragment传递过来的数据
    Log.d(TAG, "onFragmentInteraction: " + data);
}

实现Activity向Fragment传递数据

在Activity中,通过FragmentManager获取到管理Fragment的FragmentTransaction(事务),通过FragmentTransaction的add、replace、remove等方法来管理Fragment的添加、删除、替换等操作。可实现Activity向Fragment传递数据的操作方式如下:

1.在Activity中获取所对应的Fragment对象

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container);

2.调用Fragment对象的公共方法,向Fragment传递数据

fragment.updateData(data);

3.在Fragment中定义公共方法(例子中为updateData()),用于处理Activity传递过来的数据

public void updateData(String data) {
    // 处理Activity传递过来的数据
    Log.d(TAG, "updateData: " + data);
}

示例说明

下面分别列举两个示例来说明Fragment与Activity之间如何相互通信。

示例1:Fragment向Activity传递数据

示例中包含一个MainActivity和一个ExampleFragment。ExampleFragment中有一个按钮,点击按钮后向MainActivity传递数据,MainActivity则将数据输出到日志中。

MainActivity.java:

public class MainActivity extends AppCompatActivity implements OnFragmentInteractionListener {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ExampleFragment fragment = new ExampleFragment();
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container, fragment)
                .commit();
    }

    @Override
    public void onFragmentInteraction(String data) {
        // 处理Fragment传递过来的数据
        Log.d(TAG, "onFragmentInteraction: " + data);
    }
}

ExampleFragment.java:

public class ExampleFragment extends Fragment {

    private static final String TAG = "ExampleFragment";
    private OnFragmentInteractionListener mListener;

    public ExampleFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_example, container, false);
        Button button = view.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mListener != null) {
                    mListener.onFragmentInteraction("hello");
                }
            }
        });
        return view;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }
}

fragment_example.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="send data to activity" />

</LinearLayout>

示例2:Activity向Fragment传递数据

示例中包含一个MainActivity和一个ExampleFragment。MainActivity中有一个按钮,点击按钮后向ExampleFragment传递数据,ExampleFragment则将数据输出到日志中。

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ExampleFragment fragment = new ExampleFragment();
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container, fragment)
                .commit();

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container);
                fragment.updateData("hello");
            }
        });
    }
}

ExampleFragment.java:

public class ExampleFragment extends Fragment {

    private static final String TAG = "ExampleFragment";

    public ExampleFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_example, container, false);
        return view;
    }

    public void updateData(String data) {
        // 处理Activity传递过来的数据
        Log.d(TAG, "updateData: " + data);
    }
}

fragment_example.xml同上。

参考文献:

1.《Android编程权威指南》(第3版)章节14:Fragment与Activity交互

2.官方文档:https://developer.android.google.cn/training/basics/fragments/communicating

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android基础之Fragment与Activity交互详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Vue.js设计与实现无限递归学习总结

    《Vue.js 设计与实现》一书中介绍了 Vue.js 源码的实现原理和设计思路,并对一些常见的前端问题进行了深入探讨。其中,章节五部分详细介绍了 Vue.js 模板编译器的设计和实现,本攻略将重点讲解该章节,帮助读者深入理解 Vue.js 在编译阶段的实现过程,以实现无限递归的学习。 背景知识 在阅读本攻略之前,需要具备一定的 Vue.js 基础知识,熟练…

    other 2023年6月27日
    00
  • 基于命令行执行带参数的php脚本并取得参数的方法

    要执行带参数的php脚本,我们可以通过命令行的方式调用PHP解释器,并传递参数给脚本。具体步骤如下: 步骤1:编写php脚本 首先,需要编写一个php脚本,可以通过$argv来获取命令行传递的参数。$argv是一个数组,其中第一个元素是脚本文件名,从第二个元素开始是传递的参数。示例代码如下: // test.php <?php echo "T…

    other 2023年6月26日
    00
  • 了解NTFS文件夹访问权限和使用说明

    了解NTFS文件夹访问权限和使用说明 在Windows操作系统中,NTFS文件系统提供了更为强大和灵活的文件夹访问权限控制功能。下面我们就来详细了解一下NTFS文件夹的访问权限和使用说明。 NTFS文件夹访问权限 在NTFS文件系统中,我们可以为每个文件夹添加访问权限,以限制用户对文件夹的访问、修改和删除等操作。常见的访问权限包括以下几种: 读取和执行:用户…

    other 2023年6月27日
    00
  • Mac M1安装mnmp(Mac+Nginx+MySQL+PHP)开发环境

    安装mnmp(Mac+Nginx+MySQL+PHP)开发环境攻略 以下是在Mac M1芯片上安装mnmp开发环境的详细步骤: 步骤1:安装Homebrew 打开终端应用程序。 在终端中输入以下命令并按下回车键来安装Homebrew: bash /bin/bash -c \”$(curl -fsSL https://raw.githubusercontent…

    other 2023年10月13日
    00
  • Inlay技术要求

    下面是 Inlay 技术要求的完整攻略,包括基本原理、实现方法和两个示例说明。 基本原理 Inlay 技术是一种将芯片嵌入 PCB 板中的技术,可以将芯片和 PCB 板集成在一起,从而实现更小、更轻、更高效的电子产品。Inlay 技术的基本原理是将芯片嵌入 PCB 板中,然后通过封装和连接技术将芯片与 PCB 板连接起来。 实现方法 实现 Inlay 技术的…

    other 2023年5月5日
    00
  • ASP.NET中BulletedList列表控件使用及详解

    下面是“ASP.NET中BulletedList列表控件使用及详解”的完整攻略。 ASP.NET中BulletedList列表控件使用及详解 什么是BulletedList列表控件? BulletedList控件是ASP.NET Web Forms中的一种列表控件,它可以轻松地创建一个无序列表,可以用来显示一组项目。通常情况下,BulletedList控件的…

    other 2023年6月26日
    00
  • i7 8809G/8705G值得买吗?Intel AMD合体CPU i7-8705G/8809G对比深度评测

    当然,我可以为您提供一份关于i7-8705G和i7-8809G的对比深度评测攻略。以下是完整的攻略,包含两个示例说明: i7-8705G/8809G对比深度评测 1. 性能对比 示例说明一:CPU性能 i7-8705G和i7-8809G都是Intel和AMD合作推出的混合CPU,具备强大的计算能力。然而,i7-8809G采用了更高的基础频率和更大的缓存,因此…

    other 2023年10月17日
    00
  • C语言驱动开发之判断自身是否加载成功详解

    C语言驱动开发之判断自身是否加载成功详解 在C语言驱动开发中,驱动程序的加载与卸载是一个非常重要的环节,而判断驱动程序是否加载成功也是非常重要的一步。 一、判断驱动是否加载成功的方法 通过检查设备管理器中的设备状态来判断驱动是否加载成功。 通过检查日志文件来判断驱动是否加载成功。 通过编写测试工具来测试驱动程序是否加载成功。一般测试工具包含以下几个部分: 测…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部