19.3、Android -- Fragment 基础学习 --Fragment与Activity的通讯,传递消息

说明

其他的我先不动。然后开始此次学习与练习。

Activity向Fragment发送信息

Activity向Fragment发送信息的方式主要是通过Bundle(),然后通过Fragment的setArguments(Bundle)发送。Fragment通过getArguments获取信息

1、在主Java类java/com/pha/first/FragmentMainActivity.java中,修改onClick方法

先看下之前的程序
在这里插入图片描述
修改后

 public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_fra_one:
                //定义 Fragement1
                FragmentItmBlank itmBlank = new FragmentItmBlank();
                // Activity 向Fragment 发送信息
                Bundle bundle = new Bundle();
                bundle.putString("sendMsg","Activity send message to Fragment!");
                itmBlank.setArguments(bundle);
                
                ChangeFragment(itmBlank);
                break;
            case R.id.btn_fra_two:
                ChangeFragment(new FragmentItmList());
                break;
            default:
                break;
        }

两者对比可以看出来发送信息
1)、定义Bundle :

Bundle bundle = new Bundle();

2)、发送信息赋值:
目前传的字符串,其中sendMsg是消息表示码,或者说关键字。
当我们传递了,很多消息,具体指哪个消息,就是是通过第一个参数区分的。也就是练习“sendMsg”位置

bundle.putString("sendMsg","Activity send message to Fragment!");

3)、通过Fragment信息发送

itmBlank.setArguments(bundle);
2、Fragment获取Activity发送的信息

接收信息系定义在java/com/pha/first/FragmentItmBlank.java 中的onCreateView();

  • 修改前代码
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_itm_blank, container, false)
    }
  • 修改后代码
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if(root == null){
            root = inflater.inflate(R.layout.fragment_itm_blank, container, false);
        }
        Bundle bundle = this.getArguments();
        String Str = bundle.getString("sendMsg");
        Toast.makeText(this.getContext(), Str, Toast.LENGTH_SHORT).show();
        return root;
    }

从代码可以看出修改过程
1)、通过 getArguments() 获取Activity传过来的 Bundle:

Bundle bundle = this.getArguments();

2、获取Bundle中的信息
我们获取Activity发送的sendMsg消息

String Str = bundle.getString("sendMsg");

3、就可以使用activity发送的消息。
我们将消息提醒出来 。这里用的是Toast

 Toast.makeText(this.getContext(), Str, Toast.LENGTH_SHORT).show();

Fragment向Activity发送、获取信息

主要是通过Interface接口
1、接口创建两个方法,一个获取信息,一个发送信息
2、在Fragment中定义变量A(变量类型就是1定义的接口),方法(方法参数B的类型就是1定义的接口);同事方法内容是将参数B复制给变量A
3、Activity中调用fragment中的方法,其方法参数对象–就是接口内的两个方法(内部匿名类),通过这两个方法接收、发送信息
4、Fragment中通过执行变量A的方法(也是接口中的俩方法)发送、获取信息

1、创建接口方法

操作:选择新建的路径->右键->new->Java class -> interface
在这里插入图片描述
java/com/pha/first/face/FragmentSendMsgToActivity.java (名称随意起的,不要介意)

package com.pha.first.face;

import androidx.fragment.app.Fragment;

public interface FragmentSendMsgToActivity
{
    void SetMsgFagementToActivity(String str);
    String GetMsgFagementFromActivity(Fragment fragment);
}
2、Fragment中定义变量,方法

java/com/pha/first/FragmentItmBlank.java

	private FragmentSendMsgToActivity fragmentSendMsgToActivity;
    public void SetFragemntMsg (FragmentSendMsgToActivity fragmentSendMsgToActivity){
        this.fragmentSendMsgToActivity=fragmentSendMsgToActivity;
    }

其中FragmentSendMsgToActivity 是1中的接口名称
fragmentSendMsgToActivity 就是变量A
SetFragemntMsg 就是新建的方法
fragmentSendMsgToActivity:是方法中参数B,器类型也是1中的接口名称
内容就是一个A=B

3、Activity中调用Fragment中的方法
				itmBlank.SetFragemntMsg(new FragmentSendMsgToActivity() {
                    // Fragment 主动向 Activity发送信息
                    @Override
                    public void SetMsgFagementToActivity(String str) {
                        Toast.makeText(FragmentMainActivity.this, str, Toast.LENGTH_SHORT).show();
                    }
                    //Fragment 主动获取 Activity 的指定信息
                    @Override
                    public String GetMsgFagementFromActivity(Fragment fragment) {

                        return "Msg from Activity";
                    }
                });

其中itmBlank就是Fragment名称 ( 在activity向fragment过程中定义的,这就不写了 )
SetMsgFagementToActivity接收信息,也就是 说Fragment主动 Activity 发送信息,通过这个方法的的参数Str实现的
GetMsgFagementFromActivity 发送信息 ,也就是说 Fragment主动 Activity 获取信息,通过这个方法的返回值获取的

3、Fragment主动发送、获取信息
public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_fra_itm_bk_one:
                fragmentSendMsgToActivity.SetMsgFagementToActivity("Msg from Fragment");
                break;
            case R.id.btn_fra_itm_bk_two:
                String str = fragmentSendMsgToActivity.GetMsgFagementFromActivity(null);
                Toast.makeText(this.getContext(), str, Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
    }

最终代码

java/com/pha/first/FragmentMainActivity.java
package com.pha.first;

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.Toast;

import com.pha.first.face.FragmentSendMsgToActivity;

public class FragmentMainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment_main);
        findViewById(R.id.btn_fra_one).setOnClickListener(this);
        findViewById(R.id.btn_fra_two).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_fra_one:
                //定义 Fragement1
                FragmentItmBlank itmBlank = new FragmentItmBlank();
                // Activity 向Fragment 发送信息
                Bundle bundle = new Bundle();
                bundle.putString("sendMsg","Activity send message to Fragment!");
                itmBlank.setArguments(bundle);

                itmBlank.SetFragemntMsg(new FragmentSendMsgToActivity() {
                    // Fragment 主动向 Activity发送信息
                    @Override
                    public void SetMsgFagementToActivity(String str) {
                        Toast.makeText(FragmentMainActivity.this, str, Toast.LENGTH_SHORT).show();
                    }
                    //Fragment 主动获取 Activity 的指定信息
                    @Override
                    public String GetMsgFagementFromActivity(Fragment fragment) {

                        return "Msg from Activity";
                    }
                });
                 //主layout 显示 Fragment
                ChangeFragment(itmBlank);
                break;
            case R.id.btn_fra_two:
                ChangeFragment(new FragmentItmList());
                break;
            default:
                break;
        }
    }
    private void ChangeFragment(Fragment fragment) {
        FragmentManager supportFragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = supportFragmentManager.beginTransaction();
        transaction.replace(R.id.fra_one,fragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }
}
java/com/pha/first/face/FragmentSendMsgToActivity.java
package com.pha.first.face;

import androidx.fragment.app.Fragment;

public interface FragmentSendMsgToActivity
{
    void SetMsgFagementToActivity(String str);
    String GetMsgFagementFromActivity(Fragment fragment);

}
java/com/pha/first/FragmentItmBlank.java
package com.pha.first;

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;
import android.widget.Toast;

import com.pha.first.face.FragmentSendMsgToActivity;


public class FragmentItmBlank extends Fragment implements View.OnClickListener {
    private static final String TAG = "Fragment";
    private View root;

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if(root == null){
            root = inflater.inflate(R.layout.fragment_itm_blank, container, false);
        }
        Bundle bundle = this.getArguments();
        String Str = bundle.getString("sendMsg");
        Toast.makeText(this.getContext(), Str, Toast.LENGTH_SHORT).show();
        root.findViewById(R.id.btn_fra_itm_bk_one).setOnClickListener(this);
        root.findViewById(R.id.btn_fra_itm_bk_two).setOnClickListener(this);
        return root;
    }
    private FragmentSendMsgToActivity fragmentSendMsgToActivity;
    public void SetFragemntMsg (FragmentSendMsgToActivity fragmentSendMsgToActivity){
        this.fragmentSendMsgToActivity=fragmentSendMsgToActivity;
    }
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_fra_itm_bk_one:
                fragmentSendMsgToActivity.SetMsgFagementToActivity("Msg from Fragment");
                break;
            case R.id.btn_fra_itm_bk_two:
                String str = fragmentSendMsgToActivity.GetMsgFagementFromActivity(null);
                Toast.makeText(this.getContext(), str, Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }

    }
}

效果图(略)

。。。。

记忆知识点

1、Activity向Fragment发送信息

Activity向Fragment发送信息的方式主要是通过Bundle(),然后通过Fragment的setArguments(Bundle)发送。Fragment通过getArguments获取信息

2、Fragment向Activity发送、获取信息

主要是通过Interface接口
1、接口创建两个方法,一个获取信息,一个发送信息
2、在Fragment中定义变量A(变量类型就是1定义的接口),方法(方法参数B的类型就是1定义的接口);同事方法内容是将参数B复制给变量A
3、Activity中调用fragment中的方法,其方法参数对象–就是接口内的两个方法(内部匿名类),通过这两个方法接收、发送信息
4、Fragment中通过执行变量A的方法(也是接口中的俩方法)发送、获取信息

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值