Java 按后退按钮查看片段

Java 按后退按钮查看片段,java,android,android-fragments,Java,Android,Android Fragments,我有一个main活动,有两个片段a和B。片段a打开片段B 片段B中有4个(a、B、c、d)视图,每个视图加载相应的xml。当我有三种观点时,a,b,c 按下后退按钮,我进入片段A,这很好。但当我在视图“d”中并按下“后退”按钮时,我必须转到视图“c” 而不是片段A。我如何实现这个场景 我的MainActivity有onBackPressed()方法,它看起来像这样- for (Fragment frag : fm.getFragments()) { if (frag !

我有一个
main活动
,有两个片段a和B。片段a打开片段B

片段B中有4个(a、B、c、d)视图,每个视图加载相应的xml。当我有三种观点时,a,b,c 按下后退按钮,我进入片段A,这很好。但当我在视图“d”中并按下“后退”按钮时,我必须转到视图“c” 而不是片段A。我如何实现这个场景

我的MainActivity有
onBackPressed()
方法,它看起来像这样-

for (Fragment frag : fm.getFragments()) {

            if (frag != null && frag.isVisible()) {

                FragmentManager childFm = frag.getChildFragmentManager();

                if (childFm.getBackStackEntryCount() > 0) {

                    childFm.popBackStack();
                    return;
                    }
                }
        }

        if (fm.getBackStackEntryCount() > 1) {
            fm.popBackStack();
        } else {

            super.onBackPressed();

            finish();
        }

当您要查看-D时,将布尔变量设为true,然后在backbutton上按,检查该布尔值是否为true,然后显示View-C

@Override
public void onBackPressed() {
    if (isViewD_Visible) {
        // show View-C
        isViewD_Visible = false;
    }else {
        // ...
    }
}

如果您需要实现这一点,您必须监听片段中的back press事件

public class MyFragment extends Fragment implements BackPressListener {

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if(context instanceof MainActivity)
            ((MainActivity) context).setBackPressListener(this);
    }

    @Override
    public void onBackPressed() {
        //handle your back press event here
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if(getActivity() instanceof  MainActivity)
            ((MainActivity)getActivity()).setBackPressListener(null);
    }
}
首先,为back press回调创建一个接口

public interface BackPressListener {
    void onBackPressed();
}
第二,像这样配置您的活动

public class MainActivity extends AppCompatActivity {

    private BackPressListener backPressListener;

    public void setBackPressListener(BackPressListener backPressListener) {
        this.backPressListener = backPressListener;
    }

    @Override
    public void onBackPressed() {
        if (backPressListener != null)
            backPressListener.onBackPressed();
        else super.onBackPressed();
    }
}
第三,听片段中的反压事件

public class MyFragment extends Fragment implements BackPressListener {

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if(context instanceof MainActivity)
            ((MainActivity) context).setBackPressListener(this);
    }

    @Override
    public void onBackPressed() {
        //handle your back press event here
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if(getActivity() instanceof  MainActivity)
            ((MainActivity)getActivity()).setBackPressListener(null);
    }
}

您在做错事在这里,您可能会在较小的设备上遇到类似的问题,您的要求是返回b,如果您按下c

您应该考虑使用片段而不是线性布局,您可以使用
getChildFragmentManager()
在片段内部添加子片段。在添加子片段时,您还可以提到addToBackStack。然后安卓系统将自行处理

e、 g


a、b、c和d也是片段实例吗?它们基本上是线性布局视图,它们的容器是可见的,主容器是可见的。这给了我错误的循环继承,因为我的片段是如何循环继承的。我认为你做错了什么。发布你的错误信息是我的错误。。。我解决了这个问题,但我不确定在onBackPressed()中,我必须做什么才能转到视图C检查A、B、C、D视图的可见性。如果D可见,则必须更改可见性。否则,您必须调用popBackStack()对其进行投票并将其标记为正确答案。快乐编码:)