使用导航组件和菜单项,如何获得“向上”按钮以返回到上一个片段,而不是“主要”片段

时间:2020-05-08 14:24:17

标签: android android-fragments

我正在使用导航组件体系结构。我在操作栏中有一个菜单项,用户可以单击以转到设置。我正在使用一个活动到多个碎片的方法。因此,带有菜单项的该操作栏位于我的所有片段中。

我说我有3个片段。片段A是主要片段。在设置首选项中时,“ UP”按钮始终将我带回到片段A。即使我是从片段B或C调用它的。

这就是我的向上按钮(它称为here)的意思:

enter image description here

这是我实际的NavGraph

enter image description here

从中您可以看到Frag A通过操作链接到设置。我这样做是因为这是片段的宿主活动开始的起始片段。无论如何,我删除此操作并没有什么不同,它的行为仍然相同。

这是我的onOptionsItemSelected

//Preform action when selected
@Override
public boolean onOptionsItemSelected(MenuItem item) {

    return NavigationUI.onNavDestinationSelected(item, navController)
            || super.onOptionsItemSelected(item);
}

那么,如果要从片段C进行设置,我该如何回到片段C。而不是片段A?

2 个答案:

答案 0 :(得分:0)

那么,如果要从片段C进行设置,我该如何回到片段C。而不是片段A?

我假设您已经将导航操作从片段C 添加到 Settings片段,以便您可以从Fragment C导航到{{1} }。

因此,这是在导航图上演示此操作的示例:

SettingsFragment

现在,您想点击<fragment android:id="@+id/cFragment" android:name="...." android:label="fragment_c" tools:layout="@layout/fragment_c" > .... <action android:id="@+id/action_cFragment_to_settingsFragment" app:destination="@id/settingsFragment" app:popUpTo="@id/cFragment" /> </fragment> 上的向上/主页按钮以返回到SettingsFragment(或任何调用Fragment C的片段。

您可以使用后置堆栈来实现;现在,后堆栈顶部的片段是SettingsFragment,它是由操作FragmentC确定的。

您可以使用唯一活动的action_cFragment_to_settingsFragment来实现此目的,这样现在onBackPressed()就可以返回到后退堆栈中的下一个片段。

要执行此操作:如下创建SettingFragment

SettingsFragment

注意:如果您在其他片段上看到主页按钮,则可以通过以下方式将其删除:

public class SettingsFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        return inflater.inflate(R.layout.fragment_settings, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        setHasOptionsMenu(true);
        ((AppCompatActivity) requireActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            requireActivity().onBackPressed(); // Back to the next fragment at the back stack
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

}

答案 1 :(得分:0)

NavigationUI包含用于处理菜单项的onNavDestinationSelected方法。默认情况下,此方法弹出整个后堆栈。解决方法是将android:menuCategory="secondary"添加到菜单中各项的xml中,如下所述:

enter image description here