带有导航组件的Android Popper导航

时间:2020-05-06 01:23:10

标签: android android-fragments navigation fragment android-architecture-navigation

我有两个片段 FirstFragment WelcomeFragment

FirstFragment 中,我有一些动画,我从服务器加载数据,然后使用NavController导航到 WelcomeFragment

navController.navigate(R.id.action_firstFragment_to_welcomeFragment);

我的nav_graph是这样的:

<fragment
        android:id="@+id/firstFragment"
        android:name="com.flyeducation.UI.FirstFragment"
        android:label="fragment_first"
        tools:layout="@layout/fragment_first">
        <action
            android:id="@+id/action_firstFragment_to_welcomeFragment"
            app:destination="@id/welcomeFragment"
            app:enterAnim="@anim/fade_in"
            app:exitAnim="@anim/fade_out"
            app:popEnterAnim="@anim/fade_in"
            app:popExitAnim="@anim/fade_out" />
    </fragment>

我希望它具有以下行为:

从FirstFragment导航到WelcomeFragment,但是在按下返回按钮时无法返回FirstFragment 应用程序应该像按下主屏幕按钮一样关闭,然后回到呆在WelcomeFragment中

我在nav_graph XML中尝试过的文档中:

app:popUpTo="@id/firstFragment"
app:popUpToInclusive="true"

该应用程序关闭,但是当我返回到该应用程序时,它确实从FirstFragment重新开始,并且没有保持我想要的状态,该状态一直停留在WelcomeFragment中

从其他问题中,我也在WelcomeFragment中尝试过此方法:

navController.popBackStack(R.id.firstFragment, true);

任何人都可以帮助我实现想要的行为

编辑:

当我在 WelcomeFragment

上按下onKeyDown时,我最终拦截了onKeyDown并模拟了Home单击

在我的 WelcomeFragment

public void myOnKeyDown(int key_code, Context context){
        openDialog(context);
    }

    public void openDialog(final Context context) {
            new AlertDialog.Builder(context)
                    .setTitle("Exit ! ")
                    .setMessage("Are you sure you wanna quit our App , we will miss you !")
                    .setNegativeButton(android.R.string.cancel, null) // dismisses by default
                    .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Intent i = new Intent(Intent.ACTION_MAIN);
                            i.addCategory(Intent.CATEGORY_HOME);
                            context.startActivity(i);
                        }
                    })
                    .create()
                    .show();
        }

,这在我的活动中:

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        ((WelcomeFragment) WelcomeFragment).myOnKeyDown(keyCode, this);
        return false ;
    }

这给了我我想要的行为,但我认为这不是最佳实践

2 个答案:

答案 0 :(得分:1)

您永远不应弹出图形的开始目标。按照Principles of Navigation

注意:一个应用程序可能具有一次性设置或一系列登录屏幕。这些conditional screens不应被视为开始目标,因为用户仅在某些情况下才看到这些屏幕。

相反,只有在用户尚未进入该屏幕的情况下,您才应遵循first time user experience documentation将用户从您的WelcomeFragment重定向到您的FirstFragment

通过此设置,用户有99%的时间获得了更快的体验(他们只能加载一个片段),依靠您的NavigationUI的{​​{1}}助手可以正常工作,而{{3 }}也可以正常工作。

答案 1 :(得分:0)

因此,这是在我的情况下使用的正确解决方案,它将具有问题中描述的相同行为,并且与我在onKeyDown中覆盖MainActivity时的行为

OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
            @Override
            public void handleOnBackPressed() {
                openDialog(getContext());
            }
        };
        requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), callback);

另一个线索:

app:popUpTo="@id/fragment" 

在片段位于后堆栈中时使用

app:popUpToInclusive="true"

将清除堆栈,直到击中app:popUpTo中的片段ID

这里popUpTo and popUpToInclusive