java - 如何与 FragmentStatePagerAdapter 内的 Fragment 进行通信?

标签 java android

我正在尝试根据 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 (GradeAverageFragmentGroupAverageFragmentTopGradesFragment ...) 像这样:

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/

相关文章:

android - surfaceChanged 什么时候激活?

java - Spring boot @RequestBody with @Valid- ExceptionHandler for MethodArgumentNotValidException

java.util.LinkedList.Node<E> 无法分配给 GWT Serialized?

java - 无序(或哈希)映射中的迭代器

android - SparseIntArray 查找性能

android - 如何在 Android 中显示多个警告对话框

android - 选项菜单 - 从项目中删除焦点

android - 在 RelativeLayout 中分配额外的空间

java - 调整大小时行布局不更改控件

java.lang.NoClassDefFoundError : Could not initialize class org. apache.commons.logging.LogFactory