最近在看子林的教程学习Android开发,发现Fragment之间通过接口传递时会有这么一个问题,如果Activity中的Fragment 全局对象未公开,而在获取时通过:getActivity,getSupportFragmentManager,findFragmentById() 然后获得的对象进行强转自己的Fragment类对象,再调用类对象进行接口对象赋值。却怎么也不成功,而在Activity类中将对象的private改为public,直接调用的方法,却又可以。。。。这个是啥情况?
★★★★★ B向A传不成功,因为A是通过 getSupportFragmentManager,findFragmentById() 然后再强转的!!!!
Activity类:↓
package com.example.myapplicationbase.datapass;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import android.os.Bundle;
import com.example.myapplicationbase.R;
import com.example.myapplicationbase.datapass.fragment.FragmentPassA;
import com.example.myapplicationbase.datapass.fragment.FragmentPassB;
public class FragmentPassBetweenActivity extends AppCompatActivity {
private FragmentPassA fragmentPassA ;
private FragmentPassB fragmentPassB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_pass_between);
fragmentPassA = new FragmentPassA();
fragmentPassB = new FragmentPassB();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fcv_a,fragmentPassA)
.commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fcv_b,fragmentPassB)
.commit();
}
public FragmentPassA getFragmentPassA() {
return this.fragmentPassA;
}
}
FragmentB类 ↓:
package com.example.myapplicationbase.datapass.fragment;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import com.example.myapplicationbase.R;
import com.example.myapplicationbase.datapass.FragmentPassBetweenActivity;
public class FragmentPassB extends Fragment {
private Button btnPass,btnPassByInterface;
private TextView tvReceive;
private String mData;
public void setData(String data) {
this.mData = data;
tvReceive.setText(mData);
}
public FragmentPassB() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_pass_b, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
tvReceive = view.findViewById(R.id.tv_b_receive);
btnPass = view.findViewById(R.id.btn_pass_b);
btnPassByInterface = view.findViewById(R.id.btn_pass_b_byInterface);
tvReceive.setText(mData);
btnPass.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//向FragmentA传递数据
FragmentPassA fragmentPassA = ((FragmentPassBetweenActivity) getActivity()).getFragmentPassA();
fragmentPassA.setData("这是FragmentB传过来的数据");
}
});
// 通过接口接收FragmentA传过来的数据 ↓
((FragmentPassBetweenActivity)getActivity())
.getFragmentPassA()
.setOnFragmentAChangeListener(new FragmentPassA.OnFragmentAChangeListener() {
@Override
public void OnFragmentAChange(String data) {
mData=data;
tvReceive.setText(mData);
}
});
btnPassByInterface.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mFragmentBChangeListener != null) {
mFragmentBChangeListener.onFragmentBChange("这是FragmentB通过接口传递的数据");
}
}
});
}
private OnFragmentBChangeListener mFragmentBChangeListener;
public void setOnFragmentBChangeListener(OnFragmentBChangeListener onFragmentBChangeListener) {
this.mFragmentBChangeListener = onFragmentBChangeListener;
}
public interface OnFragmentBChangeListener{
void onFragmentBChange(String data);
}
}
FragmentA类 ↓:
package com.example.myapplicationbase.datapass.fragment;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import com.example.myapplicationbase.R;
import com.example.myapplicationbase.datapass.FragmentPassBetweenActivity;
public class FragmentPassA extends Fragment {
private Button btnPass,btnPassByInterface;
private TextView tvReceive;
private String mData;
public FragmentPassA() {
}
public void setData(String data) {
this.mData = data;
tvReceive.setText(mData);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_pass_a, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
tvReceive = view.findViewById(R.id.tv_a_receive);
btnPass = view.findViewById(R.id.btn_pass_a);
btnPassByInterface = view.findViewById(R.id.btn_pass_a_byInterface);
tvReceive.setText(mData);
btnPass.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//向FragmentB传递数据
Fragment fragmentB = ((FragmentPassBetweenActivity) getActivity())
.getSupportFragmentManager().findFragmentById(R.id.fcv_b);
if (fragmentB != null) {
((FragmentPassB)fragmentB).setData("这是FragmentA传过来的数据");
}
}
});
btnPassByInterface.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mFragmentAChangeListener != null) {
mFragmentAChangeListener.OnFragmentAChange("这是FragmentA通过接口传递的数据");
}
}
});
// 通过接口接收FragmentB传过来的数据 ↓
/*
((FragmentPassBetweenActivity) getActivity()).fragmentPassB.setOnFragmentBChangeListener(new FragmentPassB.OnFragmentBChangeListener() {
@Override
public void onFragmentBChange(String data) {
mData=data;
tvReceive.setText(mData);
}
}); */
//-------------------★★★ 问题出在这儿 ↓ ★★★------------------------------
Fragment fragmentB = ((FragmentPassBetweenActivity) getActivity())
.getSupportFragmentManager().findFragmentById(R.id.fcv_b);
((FragmentPassB)fragmentB).setOnFragmentBChangeListener(new FragmentPassB.OnFragmentBChangeListener() {
@Override
public void onFragmentBChange(String data) {
mData=data;
tvReceive.setText(mData);
}
});
}
private OnFragmentAChangeListener mFragmentAChangeListener;
public void setOnFragmentAChangeListener(OnFragmentAChangeListener FragmentAChangeListener) {
this.mFragmentAChangeListener = FragmentAChangeListener;
}
public interface OnFragmentAChangeListener {
void OnFragmentAChange(String data);
}
}