Android官方培训课-Fragment间的通信

本文介绍了一个简单的Fragment间通信实现方式,通过接口回调机制完成数据传递。详细展示了如何在发送方Fragment定义接口,在宿主Activity中实现该接口并处理消息,以及如何在接收方Fragment中获取传递的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Author : jianlong.zhang
Date : 6/6/2017
Desc : 官方培训课程学习,Communicating with other fragment(fragment之间的通信)。
Thanks: Goole 官方培训教程


Tab:
* 这节官方课程其实用处不是很大,因为我们可能会用第三方通信。
* new fragment实例的时候要使用无参函数
* 想要传递参数,要是用setArguments()来传递

这里简单介绍一下官方的思路。

  1. 利用接口实现发信Fragment与Activity通 信将要传递的内容通过接口传递给Activity.
  2. 再由activity启动收信Fragment时,将信作为收信Fragment的Arguments,传递给收信Fragment.
  3. 收信fragment启动后在onCreateView()方法中,通过getAguments获取信得内容。

发信接口

  • 在发信fragment中创建 接口。
 interface MessageHandler {
        void handMessage(String message);
    }
  • 让activity 实现接口
  • 将信 作为arguments 设置给收信Fragment
  SecFragment instance = new SecFragment();
        Bundle bundle = new Bundle();
        bundle.putString(MESSAGE, message);
        instance.setArguments(bundle);
  • 收信fragment 接收信
        String message = getArguments().getString(MESSAGE);

完整代码如下:

  • 发信fragment
package com.zhouzhouwang88.shoppingclient.test;


import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

import com.zhouzhouwang88.shoppingclient.R;

/**
 * A simple {@link Fragment} subclass.
 */
public class FirstFragment extends Fragment implements View.OnClickListener {


    public static String TAG = "FirstFragment";

    private EditText contentEd;
    private Button sendBtn;
    private MessageHandler callBack;

    @Override
    public void onClick(View v) {
        if (TextUtils.isEmpty(contentEd.getText().toString())) {
            callBack.handMessage("没有输入值");
            return;
        }

        callBack.handMessage(contentEd.getText().toString());
    }

    interface MessageHandler {
        void handMessage(String message);
    }


    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        callBack = (FragmentStudyActivity) context;


    }

    public static FirstFragment instance() {
        return new FirstFragment();
    }


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

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        contentEd = (EditText) view.findViewById(R.id.ed_content);
        sendBtn = (Button) view.findViewById(R.id.btn_send_content);

        sendBtn.setOnClickListener(this);
    }
}
  • activity实现接口
package com.zhouzhouwang88.shoppingclient.test;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;

import com.zhouzhouwang88.shoppingclient.R;

public class FragmentStudyActivity extends FragmentActivity implements View.OnClickListener, FirstFragment.MessageHandler {
    private FrameLayout fragmentContainer;
    private Button showFirstBtn, showSecBtn;
    private FirstFragment mFirstFragment;
    private SecFragment mSecFragment;
    private String message;

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

        fragmentContainer = (FrameLayout) findViewById(R.id.fl_fragment_container);
        showFirstBtn = (Button) findViewById(R.id.btn_show_first);
        showSecBtn = (Button) findViewById(R.id.btn_show_sec);

        showFirstBtn.setOnClickListener(this);
        showSecBtn.setOnClickListener(this);
        mFirstFragment = FirstFragment.instance();
        if (null != fragmentContainer) {

            mFirstFragment.setArguments(getIntent().getExtras());

            getSupportFragmentManager()
                    .beginTransaction()
                    .add(fragmentContainer.getId(), mFirstFragment, FirstFragment.TAG)
                    .commitAllowingStateLoss();


        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_show_first:
                showSelectFragment(FirstFragment.instance());
                break;
            case R.id.btn_show_sec:
                showSelectFragment(SecFragment.instance(message));
                break;
        }
    }

    private <T extends Fragment> void showSelectFragment(T fragment) {
        if (fragment.isAdded()) {
            return;
        }
        getSupportFragmentManager()
                .beginTransaction()
                .replace(fragmentContainer.getId(), fragment)
                .addToBackStack(null)//允许fragment回退
                .commitAllowingStateLoss();

    }

    @Override
    public void handMessage(String message) {

        this.message = message;
    }
}
  • 收信fragment
package com.zhouzhouwang88.shoppingclient.test;


import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.zhouzhouwang88.shoppingclient.R;

/**
 * A simple {@link Fragment} subclass.
 */
public class SecFragment extends Fragment {
    public static String TAG = "SecFragment";
    public static final String MESSAGE = "MESSAGE";


    public static SecFragment instance() {
        return new SecFragment();
    }

    public static SecFragment instance(String message) {
        SecFragment instance = new SecFragment();
        Bundle bundle = new Bundle();
        bundle.putString(MESSAGE, message);
        instance.setArguments(bundle);

        return instance;
    }

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

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        String message = getArguments().getString(MESSAGE);
        Log.d(TAG, message);
        return inflater.inflate(R.layout.fragment_sec, container, false);
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值