自学内容网 自学内容网

Activity 通过Bundle与Fragment通信

基础夯实:

Activity与Fragment通信是Android开发中非常基础且重要的一个环节。以下是对Activity与Fragment通信基础理论的详细解释:

一、Activity与Fragment的关系

Activity是Android应用中的一个单独屏幕,可以包含布局和多个Fragment。
Fragment代表了Activity用户界面的一部分,可以嵌入到Activity中或者在多个Activity之间进行复用。
Fragment的生命周期与Activity绑定,但它也有自己独立的生命周期。

二、通信场景

Activity与Fragment之间的通信通常包括数据传递、状态变化通知、生命周期控制等多种情形,以实现整个UI界面的协调和交互。例如,当实现一个图文分享功能时,点击分享按钮会弹出ShareDialogFragment的弹窗页面,此时ShareDialogFragment需要获取当前图文的内容进行分享,这就需要Activity将图文内容传递给Fragment。

三、通信方式

1. 通过接口回调

定义接口:在Fragment中定义一个接口,包含将要被通信双方实现和调用的方法。
实现接口:Activity实现这个接口,并在适当的时候调用Fragment中的方法。
实例化接口:在Fragment的onAttach()方法中,通过将作为参数传入onAttach()的Activity做类型转换来实例化一个接口实例。
调用接口方法:Fragment通过调用接口中的方法来进行通信。
这种方式允许Fragment在不直接依赖Activity的情况下进行通信,提高了代码的解耦性和Fragment的可复用性。

2. 通过Bundle

当Activity需要向Fragment传递数据时,可以将数据放入Bundle中,然后在创建Fragment时通过setArguments()方法将Bundle传递给Fragment。
Fragment通过getArguments()方法获取传递过来的Bundle,并从中提取数据。
这种方式适用于在创建Fragment时传递数据,且这些数据在Fragment的生命周期内不会改变。

3. 其他方式

除了接口回调和Bundle外,还可以通过广播(Broadcast)、EventBus、ViewModel等方式实现Activity与Fragment之间的通信。这些方式各有优缺点,开发者可以根据具体需求选择合适的通信方式。

四、注意事项

在进行Fragment与Activity通信时,要确保Fragment已经正确附加到Activity上,否则可能会引发空指针异常。
为了保证Fragment的可复用性,应避免在Fragment中直接调用其他Fragment或Activity的方法。
在使用Bundle传递数据时,要注意数据的大小和类型限制。
总之,Activity与Fragment之间的通信是Android开发中非常基础且重要的一个环节。掌握多种通信方式并灵活运用,可以构建出更加高效和可复用的Android应用。

效果展示:

在这里插入图片描述

实现功能:

Activity 通过Bundle与Fragment通信,实现点击change,fragment中打印你好的功能

核心代码:

MainActivity

package com.example.application1;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 设置活动的内容视图
        setContentView(R.layout.activity_main);

        // 初始化按钮并设置点击监听器
        Button button = findViewById(R.id.btn);
        button.setOnClickListener(this);
        Button button2 = findViewById(R.id.btn_2);
        button2.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn:
                // 当按钮被点击时,替换 Fragment
                Bundle bundle = new Bundle();
                bundle.putString("message","你好");
                BlankFragment1 bf = new BlankFragment1();
                bf.setArguments(bundle);
                replaceFragment(bf);
                break;
            case R.id.btn_2:
                // 当按钮被点击时,替换 Fragment
                replaceFragment(new ItemFragment());
                break;
        }

    }

    // 动态切换 Fragment 的方法
    private void replaceFragment(Fragment fragment) {
        // 获取 FragmentManager
        FragmentManager fragmentManager = getSupportFragmentManager();
        // 开始事务
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        // 替换 Fragment
        transaction.replace(R.id.framelayout, fragment);
        transaction.addToBackStack(null);
        // 提交事务
        transaction.commit();
    }
}

BlankFragment

package com.example.application1;

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * A simple {@link Fragment} subclass.
 * Use the {@link BlankFragment1#newInstance} factory method to
 * create an instance of this fragment.
 */
public class BlankFragment1 extends Fragment {
    private static final String TAG = "BlankFragment1";

    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

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

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment BlankFragment1.
     */
    // TODO: Rename and change types and number of parameters
    public static BlankFragment1 newInstance(String param1, String param2) {
        BlankFragment1 fragment = new BlankFragment1();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle bundle = this.getArguments();
        String string = bundle.getString("message");
        Log.d(TAG,"onCreate"+ string);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank1, container, false);
    }
}

原文地址:https://blog.csdn.net/qq_54122113/article/details/143711475

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!