我正在尝试根据 GradeFragment 中的数据输入更新 TabAdapter 类中所有 fragment 的内容。在 GradeFragment 中,我正在更新 Grupe 对象,但在发生这种情况时我无法通知其他 fragment 。我尝试使用接口(interface),但无法将其附加到 GradeFragment。我怎样才能实现这个目标?
这是我的 TabAdapter 类:
public class TabAdapter extends FragmentStatePagerAdapter {
private int totalTabs;
private Grupe grupe;
private GradeFragment gradeFragment;
public TabAdapter(FragmentManager fm, int totalTabs, Grupe grupe) {
super(fm);
this.totalTabs = totalTabs;
this.grupe = grupe;
}
// this is for fragment tabs
@Override
public Fragment getItem(int position) {
Bundle bundle = new Bundle();
bundle.putSerializable("gr", grupe);
switch (position) {
case 0:
gradeFragment = new GradeFragment();
gradeFragment.setArguments(bundle);
return gradeFragment;
case 1:
GradeAverageFragment gradeAverageFragment = new GradeAverageFragment();
gradeAverageFragment.setArguments(bundle);
return gradeAverageFragment;
case 2:
GroupAverageFragment groupAverageFragment = new GroupAverageFragment();
groupAverageFragment.setArguments(bundle);
return groupAverageFragment;
case 3:
TopGradesFragment topGradesFragment = new TopGradesFragment();
topGradesFragment.setArguments(bundle);
return topGradesFragment;
default:
return null;
}
}
// this counts total number of tabs
@Override
public int getCount() {
return totalTabs;
}
}
最佳答案
将 GradeFragment
设置为彼此 Fragment
的目标 fragment (GradeAverageFragment
、GroupAverageFragment
、TopGradesFragment
...) 像这样:
GradeAverageFragment gradeAverageFragment = new GradeAverageFragment();
gradeAverageFragment.setArguments(bundle);
gradeAverageFragment.setTargetFragment(gradeFragment, 0);
return gradeAverageFragment;
简单原型(prototype):
interface OnUpdateGrupeListener {
void onGrupeUpdated(Grupe newGrupe);
}
interface UpdateGrupeHost {
void onAttachUpdateGrupeListener(OnUpdateGrupeListener listener);
void onDetachUpdateGrupeListener(OnUpdateGrupeListener listener);
}
public static class GradeFragment extends Fragment implements UpdateGrupeHost {
private final ArrayList<OnUpdateGrupeListener> listeners = new ArrayList<>();
@Override
public void onAttachUpdateGrupeListener(OnUpdateGrupeListener listener) {
listeners.add(listener);
}
@Override
public void onDetachUpdateGrupeListener(OnUpdateGrupeListener listener) {
listeners.remove(listener);
}
private void notifyOthers(Grupe newGrupe) {
for (OnUpdateGrupeListener l : listeners) {
l.onGrupeUpdated(newGrupe);
}
}
}
/*
GradeAverageFragment,
GroupAverageFragment,
TopGradesFragment
*/
public static class GradeAverageFragment extends Fragment implements OnUpdateGrupeListener {
@Nullable
private UpdateGrupeHost callback;
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (getTargetFragment() instanceof UpdateGrupeHost) {
callback = (UpdateGrupeHost) getTargetFragment();
callback.onAttachUpdateGrupeListener(this);
}
}
@Override
public void onDetach() {
super.onDetach();
if (callback != null) {
callback.onDetachUpdateGrupeListener(this);
}
callback = null;
}
@Override
public void onGrupeUpdated(Grupe newGrupe) {
// updated grupe received
}
}
关于java - 如何与 FragmentStatePagerAdapter 内的 Fragment 进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58085050/