带片段的后退按钮导航

back button navigation with fragments

我正在构建一个有点像画廊的应用程序。我使用一个 activity 来保存 fragment_1,我在其中在回收视图中显示图像。从 fragment_1 我可以去 fragment_2。这两个片段都有自己不同的工具栏。我的愿望是通过按工具栏中的后退箭头从 fragment_2 回到 fragment_1。

我如何从 fragment_1 到 fragment_2:

Fragment2 fragment2 = new Fragment2();
    getActivity().getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, fragment2)
            .addToBackStack(null).commit();

我在 fragment_2 中已经做了什么:

Toolbar toolbar = getView().findViewById(R.id.toolbar_2);
    ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
    ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayShowHomeEnabled(true);

这没有用:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            getActivity().onBackPressed();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

如果你想要onOptionsItemSelected从片段中触发你需要设置setHasOptionsMenutrue,例如从onViewCreated:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
   setHasOptionsMenu(true);
}

使用 popBackStack() 方法从返回堆栈中删除片段。 尝试使用此代码:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            getActivity().getSupportFragmentManager().popBackStack();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
@Override public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            getActivity().getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, new fragment1).commit();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    } }

如果每个片段在自己的布局中都有 Toolbar,那么在 onCreateView 中膨胀 View 之后,您可以轻松地在 onViewCreated 中访问 Toolbar。之后你可以设置导航图标并调用setNavigationOnClickListener。在内部,您可以选择几种方法,用新的 Fragmentremove 现有的 Fragment 替换现有的 Fragment 或使用 popBackStack。在看起来像这样的代码中:

Toolbar toolbar = view.findViewById(R.id.toolbar) // id of your toolbar 
 toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp); // set the back arrow in toolbar 

    //set click listener on back arrow
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            getFragmentManager().popBackStack();
 });

要使用此方法,您需要在 addToBackStack 中添加不含空值的 Fragment。例如:

getFragmentManager().beginTransaction()
        .add(R.id.container, your fragment here)
        .addToBackStack("BackStack").commit();