这个简单的Demo实现Fragment1向Fragment2传值的功能

 

首先编写两个fragment的布局文件:

Anroid学习之 两个Fragment之间传递信息-LMLPHP

Fragment1中使用一个EditText用于输入待发送至Fragment2中的信息,使用一个Button,点击后将EditText中的信息传输给Fragment2,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#96CDCD"
    android:padding="20dp">

    <EditText
        android:id="@+id/edt1"
        android:singleLine="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/hint"
        android:padding="10dp"
        android:textColor="#6A5ACD"
        android:textColorHint="#6A5ACD"
        android:textSize="30sp" />

    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/edt1"
        android:layout_marginTop="10dp"
        android:text="@string/send1"
        android:textAllCaps="false"
        android:textColor="#708090"
        android:textSize="45sp" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn1"
        android:layout_marginTop="15dp"
        android:gravity="center"
        android:text="@string/banner_f1"
        android:textColor="#6A5ACD"
        android:textSize="50sp" />

</RelativeLayout>

Anroid学习之 两个Fragment之间传递信息-LMLPHP

Fragment2中使用一个TextView用于接受Fragment1处传来的信息,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#F5F5DC"
    android:padding="20dp">

    <TextView
        android:id="@+id/tv2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:background="@drawable/textview"
        android:padding="15dp"
        android:textSize="30sp" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tv2"
        android:layout_marginTop="30dp"
        android:gravity="center"
        android:text="@string/banner_f2"
        android:textAllCaps="false"
        android:textColor="	#CD5555"
        android:textSize="50sp" />

</RelativeLayout>

在activity_main中将两个fragment加入进来,注意设置<fragment/>的name属性,这是在主Activity布局中嵌入两个fragment布局的关键,这里要注意将两个Fragment的.java文件和MainActivity文件放到同一目录下

Anroid学习之 两个Fragment之间传递信息-LMLPHP

 

接下来开始编写java文件,这里传输信息使用第三方的EventBus来实现,首先我们要将EventBus添加到我们的工程中:

File → Project Structure → app → Dependencies

点击右上角绿色的“+”号在输入框中输入EventBus后点击搜索(可能需要等待一会儿),找到如图所示的eventbus后按ok即可。

Anroid学习之 两个Fragment之间传递信息-LMLPHP

接下来我们开始正式编写Java代码。

首先我们来看一下逻辑相对简单的Fragment2.java,因为Fragment2是接收消息的一方,所以使用

 EventBus.getDefault().register(this);

这行语句将Fragment2类型的对象注册为接受方,再编写一个setData(String)函数,传入一个String,将其显示到fragment2的TextView中。这样Fragment2.java的关键部分就算结束了。

package com.example.a59129.twofragments;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;

public class Fragment2 extends Fragment {

    private TextView tv2;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = View.inflate(getActivity(), R.layout.fragment2, null);
        EventBus.getDefault().register(this);
        tv2 = view.findViewById(R.id.tv2);
        return view;
    } //onCreateView()

    @Subscribe
    public void setData(String string) {
        tv2.setText(string);
    } //setData()

    @Override
    public void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    } //onDestroy()

} //class

之后再来看一下Fragment1.java,我们在Fragment1.java中使用post()方法将EditText中的信息取出后并上传(可以这么理解吧),然后写一个用于数据传输的接口,这个接口将在MainActivity中实现

 

package com.example.a59129.twofragments;

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

import org.greenrobot.eventbus.EventBus;

public class Fragment1 extends Fragment {

    private EditText edt1;
    private Button btn1;
    private OnDataTransmissionListener mListener;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view = View.inflate(getActivity(), R.layout.fragment1, null);
        edt1 = view.findViewById(R.id.edt1);
        btn1 = view.findViewById(R.id.btn1);

        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //从fragment1的EditText中获取输入的信息,并提交
                EventBus.getDefault().post(edt1.getText().toString());
                //隐藏键盘,防止键盘遮挡fragment2的显示区
                InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                if (imm.isActive()) {
                    imm.hideSoftInputFromWindow(view.getApplicationWindowToken(), 0);
                }
            }
        });

        return view;
    } //onCreateView()

    @Override
    public void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    } //onDestroy

    //接口回调的方法
    public interface OnDataTransmissionListener {
        void dataTransmission(String data);
    } //OnDataTransmissionListener

    public void setOnDataTransmissionListener(OnDataTransmissionListener mListener) {
        this.mListener = mListener;
    } //setOnDataTransmissionListener()

} //class

最后我们来看一下MainActivity.java,分别创建一个Fragment1对象(fragment)和一个Fragment2对象(fragment2),实现Fragment1中的接口函数,使用Fragment2中封装的setData(String) 函数将获取到的数据显示到fragment2的TextView中

package com.example.a59129.twofragments;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Fragment1 fragment1 = new Fragment1();
        final Fragment2 fragment2 = new Fragment2();

        fragment1.setOnDataTransmissionListener(new Fragment1.OnDataTransmissionListener() {

            @Override
            public void dataTransmission(String data) {
                fragment2.setData(data);
            }
        });

    } //onCreate()

} //class

 

运行效果:

Anroid学习之 两个Fragment之间传递信息-LMLPHP

完整Project下载:https://pan.baidu.com/s/13DgbFTcXNcM-foa4R7kcCw

10-07 16:36