Android基础之Fragment与Activity交互详解

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日

相关文章

  • 页面加载完成后再执行JS的jquery写法以及区别说明

    在网页中,我们经常需要在页面加载完成后再执行一些 JavaScript 代码。这个需求非常普遍,比如我们需要在 DOM 树构建完成后再去操作元素,或者需要等待图片等资源加载完成后再进行后续的逻辑处理。在这种需求下,我们可以使用 JQuery 提供的 ready() 方法来处理,同时,使用 ready() 方法还有一定的性能优势。下面是详细的攻略: 什么是 j…

    other 2023年6月25日
    00
  • 解决无法连接到recaptcha服务

    以下是“解决无法连接到reCAPTCHA服务”的完整攻略: 解决无法连接到reCAPTCHA服务 reCAPTCHA是一种用于防止机器人攻击的Google服务。如果您在使用reCAPTCHA时遇了无法连接到reCAPTCHA服务的问题,本攻略将为您提供一些解决方案。 步骤1:检查网络连接 首先,您需要检查您的网络连接是否正常。如果您的网络连接不稳定或中断,您…

    other 2023年5月7日
    00
  • gradle使用maven仓库的方法

    以下是关于“Gradle使用Maven仓库的方法”的完整攻略,包括Gradle使用Maven仓库的定义、Gradle使用Maven仓库的方法、示例说明和注意事项。 Gradle使用Maven仓库的定义 Gradle是一种基于Apache Maven和Apache Ant的构建工具,可以使用Maven仓库来管理依赖项。Maven仓库是一个存储Java库和元数据…

    other 2023年5月8日
    00
  • Win10全新Edge浏览器F12开发人员工具更新 可测试网页运行情况

    Win10全新Edge浏览器F12开发人员工具是开发者测试网页运行情况的有用工具。下面是详细的攻略: 更新F12开发人员工具 打开Win10 Edge浏览器,并进入网页。 在浏览器的右上角中找到“更多选项”图标,点击打开菜单。 从菜单中选择“开发人员”。 在新的菜单中找到“更多工具”选项,并点击打开。 选择“开发人员工具”。 这将打开F12开发人员工具。 点…

    other 2023年6月28日
    00
  • Linux下SVN服务器自动更新文件到Web目录的方法

    实现Linux下SVN服务器自动更新文件到Web目录的方法,需要按照以下步骤进行: 1. 安装SVN服务器 首先安装Subversion (SVN)服务器,可以使用以下命令进行安装: sudo apt-get update sudo apt-get install subversion 2. 创建SVN仓库 使用以下命令创建SVN仓库: sudo svnad…

    other 2023年6月27日
    00
  • 详解配置 Apache 服务器支持 PHP 文件的解析

    下面是详解配置 Apache 服务器支持 PHP 文件的解析的完整攻略。 1. 安装 Apache 和 PHP 首先,确保服务器已经安装了 Apache 和 PHP,这可以通过以下命令来检查: $ sudo apt-get update $ sudo apt-get install apache2 $ sudo apt-get install php lib…

    other 2023年6月27日
    00
  • 易语言通过get的方式多线程刷微视播放量的代码

    易语言通过get的方式多线程刷微视播放量的代码攻略 1. 简介 在易语言中,可以通过发送GET请求来模拟用户访问微视视频,从而实现刷播放量的效果。多线程可以提高刷播放量的效率,使得同时刷多个视频的播放量成为可能。 2. 实现步骤 以下是实现多线程刷微视播放量的代码攻略: 2.1 导入相关模块 首先,需要导入一些易语言的相关模块,以便后续使用。例如: 导入 网…

    other 2023年7月29日
    00
  • jQuery实现自定义事件的方法

    要实现自定义事件,我们需要使用jQuery中的trigger()方法和bind()方法。下面是具体的步骤和示例说明: 1. 使用bind()方法绑定自定义事件 首先,我们需要使用bind()方法来绑定自定义事件。bind()方法可以将自定义事件绑定到一个DOM元素上,当这个DOM元素被触发时,该自定义事件就会被触发。 下面是一个示例,我们将一个自定义事件“m…

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