这个简单的Demo实现Fragment1向Fragment2传值的功能
首先编写两个fragment的布局文件:
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>
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文件放到同一目录下
接下来开始编写java文件,这里传输信息使用第三方的EventBus来实现,首先我们要将EventBus添加到我们的工程中:
File → Project Structure → app → Dependencies
点击右上角绿色的“+”号在输入框中输入EventBus后点击搜索(可能需要等待一会儿),找到如图所示的eventbus后按ok即可。
接下来我们开始正式编写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
运行效果:
完整Project下载:https://pan.baidu.com/s/13DgbFTcXNcM-foa4R7kcCw