Miejscem docelowym na wykresie nawigacyjnym może być aktywność. Chociaż zalecamy, aby w aplikacji było tylko jedno działanie, aplikacje często używają osobnych działań dla różnych komponentów lub ekranów w aplikacji. W takich przypadkach przydatne mogą być miejsca docelowe działań.
Compose i Kotlin DSL
Dodawanie miejsca docelowego aktywności do wykresu nawigacyjnego wygląda tak samo
zarówno w Compose, jak i podczas korzystania z DSL Kotlin z fragmentami. Dzieje się tak, ponieważ
gdy przekazujesz NavGraph
do funkcji kompozycyjnej NavHost
, użyj tego samego
createGraph()
lambda.
Więcej informacji znajdziesz w artykule Fragmenty i kod DSL Kotlin.
XML
Tworzenie miejsca docelowego aktywności przypomina tworzenie fragmentu miejsce docelowe. Charakter tego miejsca jest jednak w inny sposób.
Domyślnie Biblioteka nawigacji dołącza NavController
do układu Activity
, a wykres aktywnej nawigacji jest ograniczony do aktywnego Activity
. Jeśli użytkownik przejdzie do innej usługi Activity
, bieżące
wykres nawigacyjny nie jest już w zakresie. Oznacza to, że miejsce docelowe Activity
należy uznać za punkt końcowy w grafu nawigacji.
Aby dodać miejsce docelowe aktywności, określ miejsce docelowe Activity
za pomocą
pełna i jednoznaczna nazwa zajęć:
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/navigation_graph" app:startDestination="@id/simpleFragment"> <activity android:id="@+id/sampleActivityDestination" android:name="com.example.android.navigation.activity.DestinationActivity" android:label="@string/sampleActivityTitle" /> </navigation>
Ten kod XML jest równoważny temu wywołaniu funkcji startActivity()
:
Kotlin
startActivity(Intent(context, DestinationActivity::class.java))
Java
startActivity(new Intent(context, DestinationActivity.class));
Może się jednak zdarzyć, że takie podejście nie będzie odpowiednie. Na przykład:
może nie zależność czasu kompilowania od klasy aktywności lub możesz
preferować poziom pośredniego realizowania zamiaru ukrytego.
intent-filter
we wpisie manifestu dla miejsca docelowego Activity
określa strukturę miejsca docelowego Activity
.
Weźmy na przykład ten plik manifestu:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.navigation.activity">
<application>
<activity android:name=".DestinationActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data
android:host="example.com"
android:scheme="https" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
Odpowiednie miejsce docelowe Activity
należy skonfigurować za pomocą
Atrybuty action
i data
pasujące do tych we wpisie manifestu:
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/navigation_graph" app:startDestination="@id/simpleFragment"> <activity android:id="@+id/localDestinationActivity" android:label="@string/localActivityTitle" app:action="android.intent.action.VIEW" app:data="https://example.com" app:targetPackage="${applicationId}" /> </navigation>
Określenie targetPackage
do bieżącej wartości applicationId
ogranicza
do bieżącej aplikacji, która zawiera aplikację główną.
Tego samego mechanizmu można użyć w sytuacjach, gdy konkretna aplikacja ma być
miejsce docelowe. W tym przykładzie miejsce docelowe to aplikacja z applicationId
com.example.android.another.app
.
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/navigation_graph" app:startDestination="@id/simpleFragment"> <activity android:id="@+id/localDestinationActivity" android:label="@string/localActivityTitle" app:action="android.intent.action.VIEW" app:data="https://example.com" app:targetPackage="com.example.android.another.app" /> </navigation>
Argumenty dynamiczne
W poprzednich przykładach do przechodzenia do miejsc docelowych używano stałych adresów URL. Możesz też potrzebować obsługi adresów URL dynamicznych, w których dodatkowe informacje są wysyłane jako część adresu URL. Na przykład możesz wysłać identyfikator użytkownika w adresie URL w formacie podobnym do
https://example.com?userId=<actual user ID>
W takim przypadku zamiast atrybutu data
użyj dataPattern
.
Następnie możesz podać argumenty, które zostaną zastąpione nazwanymi zmiennymi w obrębie argumentu
wartość dataPattern
:
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/navigation_graph" app:startDestination="@id/simpleFragment"> <activity android:id="@+id/localDestinationActivity" android:label="@string/localActivityTitle" app:action="android.intent.action.VIEW" app:dataPattern="https://example.com?userId={userId}" app:targetPackage="com.example.android.another.app"> <argument android:name="userId" app:argType="string" /> </activity> </navigation>
W tym przykładzie możesz określić wartość userId
, używając jednej z tych wartości: Safe Args
lub za pomocą Bundle
:
Kotlin
navController.navigate(
R.id.localDestinationActivity,
bundleOf("userId" to "someUser")
)
Java
Bundle args = new Bundle();
args.putString("userId", "someUser");
navController.navigate(R.id.localDestinationActivity, args);
W tym przykładzie zastępujemy someUser
zamiast {userId}
i tworzymy wartość identyfikatora URI:
https://example.com?userId=someUser