Переход к определенному фрагменту при запуске приложения из общего листа - PullRequest
6 голосов
/ 06 ноября 2019

Я использую Jetpack Navigation в моем приложении с одним действием и двумя фрагментами (Фрагмент A, который также является домашним фрагментом, и Фрагмент B, который можно перемещать из Фрагмента A).

Существует intent-filter добавлен к MainActivity, как показано ниже, который может принимать простой текст.

 <activity android:name=".MainActivity"
        android:screenOrientation="portrait">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>

        <intent-filter>
            <action android:name="android.intent.action.SEND"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="@string/text_mime_type_text_plain"/>
        </intent-filter>
    </activity>

Когда пользователь выбирает мое приложение из общего списка Android, конечная цель - передать данные, полученные из Намерения, вФрагмент B. В настоящее время я получаю намерение во фрагменте A (домашний фрагмент) и затем использую NavController для перехода к фрагменту B с использованием приведенного ниже кода.

  private fun checkReceivedIntent() {
    val receivedUrlIntent = activity?.intent
    val intentAction = receivedUrlIntent?.action
    val intentType = receivedUrlIntent?.type

    if (intentAction == Intent.ACTION_SEND && intentType != null) {
        if (intentType == getString(R.string.text_mime_type_text_plain) ) {
            val receivedText = receivedUrlIntent.getStringExtra(Intent.EXTRA_TEXT)
            val action = FragmentADirections.actionFragmentAToFragmentB(receivedText)
            findNavController().navigate(action)
        }
    }
}

Проблема заключается в том, что когда фрагмент Bпри нажатии кнопки «Назад» или стрелки «Назад» на панели инструментов (даже при многократном нажатии) фрагмент A не появляется, а фрагмент B продолжает появляться.

Я не знаю, что мне не хватает. Является ли это правильным способом открыть определенный фрагмент, когда приложение открывается пользователем из общего ресурса в другом приложении?

Редактировать

activity_main. xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true">

<fragment
    android:id="@+id/navHostFragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:defaultNavHost="true"
    app:navGraph="@navigation/nav_graph" />

<com.google.android.material.bottomappbar.BottomAppBar
    android:id="@+id/bottomAppBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    app:fabCradleMargin="8dp"

    />

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:id="@+id/fabMainActivity"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_add"
    app:layout_anchor="@id/bottomAppBar" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Ответы [ 2 ]

3 голосов
/ 08 ноября 2019

Почему вы не можете напрямую перейти на Fragment B после получения Intent Extra в вашем Activity. Просто вместо определения Fragment в xml или как startDestination вы можете просто выполнить переключение на Fragment B

В Activity:

       Navigation
            .findNavController(binding.root)
            .navigate(
                R.id.navigation_from_intent_actions, bundle,
                NavOptions.Builder()
                    .setIntentExtra(extras)
                    .build()
            )
0 голосов
/ 13 ноября 2019

В вопросе Отключить фрагмент из Backstack с помощью компонента навигации Я ответил на вашу проблему. Я не хочу повторять это здесь снова. Используя объясненный подход, вы можете обрабатывать любую сложную навигацию в вашем приложении: либо назад или вперед навигацию. а также, как я уже сказал, япроверил его и он используется опубликованным приложением без ошибок.

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