带导航组件的Android popper导航

带导航组件的Android popper导航,android,android-fragments,navigation,fragment,android-architecture-navigation,Android,Android Fragments,Navigation,Fragment,Android Architecture Navigation,我有两个片段FirstFragment和WelcomeFragment 在FirstFragment中,我有一些动画,我从服务器加载数据,然后使用NavController导航到WelcomeFragment: navController.navigate(R.id.action_firstFragment_to_welcomeFragment); 我的导航图是这样的: <fragment android:id="@+id/firstFragment" a

我有两个片段FirstFragmentWelcomeFragment

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

navController.navigate(R.id.action_firstFragment_to_welcomeFragment);
我的导航图是这样的:

<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>
应用程序关闭了,但当我返回到它时,它确实从第一个片段重新开始,并没有保持我想要的状态,即保持在WelcomeFragment中

从其他问题来看,我也在WelcomeFragment中尝试了这一点:

navController.popBackStack(R.id.firstFragment, true);
任何人都可以帮助我实现想要的行为

编辑:

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();
        }
我最终截获了onKeyDown,并在按下我的WelcomeFragmentonKeyDown时模拟了Home点击

这是我的欢迎片段

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 ;
    }
这给了我想要的行为,但我不认为这是最佳实践


永远不要弹出图形的起始目标。根据:

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

相反,您应该按照将用户从
WelcomeFragment
重定向到
FirstFragment
仅在用户尚未通过该屏幕进入的情况下


通过遵循此设置,99%的用户获得更快的体验(他们只加载一个片段),依赖于您的
startDestination
NavigationUI
帮助程序可以正常工作,也可以正常工作。

因此,在我的案例中,这是正确的解决方案,它将具有问题中描述的相同行为,就像我在
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:popUpTo


这里描述了

我去了liks并简单地读了一遍,在我的例子中,FirstFragment始终是我的第一页,因为我从服务器加载该片段中的数据,WelcomeFragment是检查用户是否经过身份验证的地方not@waghydjemy-这些听起来不像用户在登录时看到的固定起始目标。这似乎完全是有条件的。你问题中提供的链接非常有用,但我在我的应用程序中没有遵循这些导航逻辑。我有我自己的,非常感谢
app:popUpToInclusive="true"