【问题标题】:back button press for view in fragment按下后退按钮以在片段中查看
【发布时间】:2018-01-11 15:48:43
【问题描述】:

我有一个MainActivity,有 2 个片段 A 和 B。片段 A 打开片段 B。

片段 B 中有 4 个 (a,b,c,d) 视图,每个视图加载相应的 xml。当我处于 3 个我的观点 a、b、c 中时 然后按后退按钮,我转到片段 A,这很好。但是当我在视图'd'中并按下返回按钮时,我必须去查看'c' 而不是 Fragment 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();
        }

【问题讨论】:

  • a,b,c 和 d 也是片段实例吗?
  • 它们基本上是线性布局视图,它们的容器是可见的,主容器已消失

标签: java android android-fragments


【解决方案1】:

如果你需要实现这一点,你必须在片段中监听 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();
    }
}

第三,从fragment监听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);
    }
}

【讨论】:

  • 它给了我错误循环继承涉及 MyFragment
  • 如何实现循环继承。我认为你做错了什么。发布您的错误信息
  • 是的,我的错误......我解决了它,但我不确定在 onBackPressed() 中我必须做什么才能查看 C
  • 检查您的 A、B、C、D 视图的可见性。如果 D 可见,则必须更改可见性。否则你必须调用 popBackStack()
  • 点赞并将其标记为正确答案。快乐编码:)
【解决方案2】:

当您要去 View-D 时,将布尔变量设为 true,然后在按下后退按钮时,检查该布尔变量是否为 true,然后显示 view-C。

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

【讨论】:

    【解决方案3】:

    您在此处做错了什么,您可能会在较小的设备上遇到类似的问题,您的要求是如果您按回 c 键则转到 b

    您应该考虑使用片段而不是线性布局,您可以使用getChildFragmentManager() 在片段中添加子片段。在添加子片段时,您也可以提及 addToBackStack。然后Android系统会自行处理。

    例如

        getChildFragmentManager().beginTransaction()
                .replace(R.id.fragment_container, fragment, tag)
                .addToBackStack(tag)
                .commit()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多