效果展示
思路分析
其实 实现这个功能思路十分简单,关键在于如何获取 需要通信的那个 fragment 对象。下面我就为大家介绍两种通信方法。如果你还不知道 fragment 怎么使用,建议先看这篇文章 Fragment的使用
代码展示
- 方法一:使用Tag获取对象
oneFragment的java代码
package com.wust.twofragrement;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.app.Fragment;
import android.widget.Button;
import android.widget.EditText;
/**
* ClassName: OneFragrement <br/>
* Description: <br/>
* date: 2021/5/27 16:26<br/>
*
* @author yiqi<br />
* @email:1820762465@qq.com
* @QQ:1820762465
* @since JDK 1.8
*/
public class OneFragrement extends Fragment {
private Button btn_set_text;
private EditText et_input_text;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragrement_one, null);
et_input_text = view.findViewById(R.id.et_input_text);
btn_set_text = view.findViewById(R.id.btn_set_text);
//方法一:第一步:获取 TwoFragrement 对象,可以使用该对象的方法了
TwoFragrement two = (TwoFragrement) getActivity().getFragmentManager().findFragmentByTag("two");
//第三步:调用对象公开的方法
btn_set_text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
two.setText(et_input_text.getText().toString());
}
});
return view;
}
}
twoFragment的java代码
package com.wust.twofragrement;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/**
* ClassName: OneFragrement <br/>
* Description: <br/>
* date: 2021/5/27 16:26<br/>
*
* @author yiqi<br />
* @email:1820762465@qq.com
* @QQ:1820762465
* @since JDK 1.8
*/
public class TwoFragrement extends Fragment {
private TextView tv_show_text;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragrement_two, null);
tv_show_text = view.findViewById(R.id.tv_show_text);
return view;
}
//第二步:在第二个fragment里公开一个修改自身TextView的方法
public void setText(String str){
tv_show_text.setText(str);
}
}
MainActivity的java代码
package com.wust.twofragrement;
import androidx.fragment.app.FragmentActivity;
import android.os.Bundle;
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//第一步,获取 Fragrement
OneFragrement oneFragrement = new OneFragrement();
TwoFragrement twoFragrement = new TwoFragrement();
//第二步,占坑
getFragmentManager().beginTransaction().replace(R.id.fl_one,oneFragrement,"one").commit();
getFragmentManager().beginTransaction().replace(R.id.fl_two,twoFragrement,"two").commit();
}
}
- 方法二:使用回调
oneFragment的java代码
package com.wust.twofragrement;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.app.Fragment;
import android.widget.Button;
import android.widget.EditText;
/**
* ClassName: OneFragrement <br/>
* Description: <br/>
* date: 2021/5/27 16:26<br/>
*
* @author yiqi<br />
* @email:1820762465@qq.com
* @QQ:1820762465
* @since JDK 1.8
*/
public class OneFragrement extends Fragment {
private Button btn_set_text;
private EditText et_input_text;
private onReceiveData mOnReceiveData;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragrement_one, null);
et_input_text = view.findViewById(R.id.et_input_text);
btn_set_text = view.findViewById(R.id.btn_set_text);
btn_set_text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//第三步:调用
mOnReceiveData.receiveData(et_input_text.getText().toString());
}
});
return view;
}
//第一步:定义接口
public interface onReceiveData{
void receiveData(String s);
}
//第二步:暴露接口
public void setOnReceiveDataListener(onReceiveData onReceiveData){
this.mOnReceiveData = onReceiveData;
}
}
twoFragment的java代码
package com.wust.twofragrement;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/**
* ClassName: OneFragrement <br/>
* Description: <br/>
* date: 2021/5/27 16:26<br/>
*
* @author yiqi<br />
* @email:1820762465@qq.com
* @QQ:1820762465
* @since JDK 1.8
*/
public class TwoFragrement extends Fragment {
private TextView tv_show_text;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragrement_two, null);
tv_show_text = view.findViewById(R.id.tv_show_text);
//第五步:实现回调
MainActivity mainActivity = (MainActivity) getActivity();
OneFragrement oneFragrement = mainActivity.getOneFragrement();
oneFragrement.setOnReceiveDataListener(new OneFragrement.onReceiveData() {
@Override
public void receiveData(String s) {
tv_show_text.setText(s);
}
});
return view;
}
}
MainActivity的java代码
package com.wust.twofragrement;
import androidx.fragment.app.FragmentActivity;
import android.os.Bundle;
public class MainActivity extends FragmentActivity {
private OneFragrement oneFragrement;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//第一步,获取 Fragrement
oneFragrement = new OneFragrement();
TwoFragrement twoFragrement = new TwoFragrement();
//第二步,占坑
getFragmentManager().beginTransaction().replace(R.id.fl_one, oneFragrement,"one").commit();
getFragmentManager().beginTransaction().replace(R.id.fl_two,twoFragrement,"two").commit();
}
//第四步:返 OneFragrement 对象
public OneFragrement getOneFragrement(){
return oneFragrement;
}
}
其实,还有其他写法,都是换汤不换药,你领悟到了这两种方法 ,其余的都迎刃而解了。