Android всплывающая навигация с компонентом навигации - PullRequest
0 голосов
/ 06 мая 2020

У меня есть два фрагмента FirstFragment и WelcomeFragment ,

в FirstFragment У меня есть анимация, и я загружаю данные с сервера, затем я перехожу на WelcomeFragment с использованием NavController:

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, но без возможности go вернуться к FirstFragment при нажатии кнопки «Назад» приложение должно закрываться, как при нажатии кнопки «Домой», а при возврате остается в WelcomeFragment

из документации, которую я пробовал в nav_graph XML:

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

, приложение закрывается, но когда я go возвращается к нему, оно запускается заново с FirstFragment и не поддерживая состояние, которое я хочу, которое остается в WelcomeFragment

из других вопросов, я также пробовал это в WelcomeFragment:

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

Кто угодно может lp мне удалось достичь желаемого поведения

EDIT:

Я закончил тем, что перехватил onKeyDown, а также имитировал щелчок по дому, когда он onKeyDown нажимается на моем WelcomeFragment

Это в моем 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();
        }

и это в моем Activity :

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

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

Это дало мне то поведение, которое я хочу, но не думаю, что это лучшая практика

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Вы никогда не должны показывать начальную точку вашего графика. В соответствии с Принципами навигации :

Примечание: приложение может иметь одноразовую настройку или серию экранов входа в систему. Эти условные экраны не следует рассматривать как начальные пункты назначения, потому что пользователи видят эти экраны только в определенных случаях.

Вместо этого вы должны следовать документации для первого использования для перенаправления пользователей с вашего WelcomeFragment на FirstFragment только в тех случаях, когда пользователь еще не прошел через этот экран.

Следуя этой настройке, в 99% случаев пользователи получают более быстрый опыт (они загружают только один фрагмент), помощники NavigationUI, которые полагаются на ваш startDestination, работают правильно, а глубокие ссылки также будут работать правильно.

0 голосов
/ 23 мая 2020

Итак, это правильное решение, которое будет использоваться в моем случае, оно будет иметь такое же поведение, как описано в вопросе, и как то, что я имел при переопределении 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

описано здесь popUpTo и popUpToInclusive

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...