ปลายทางอาจเป็นกิจกรรมก็ได้ในกราฟการนำทาง แม้ว่าดีที่สุด ฝึกให้มีกิจกรรมเดียวในแอป แอปต่างๆ มักใช้ กิจกรรมสำหรับคอมโพเนนต์หรือหน้าจอที่แตกต่างกันภายในแอป กิจกรรม ปลายทางก็อาจมีประโยชน์ในกรณีเช่นนี้
Compose และ Kotlin DSL
โดยพื้นฐานแล้ว การเพิ่มจุดหมายของกิจกรรมลงในกราฟการนำทางนั้นเหมือนกัน
ทั้งใน Compose และเมื่อใช้ Kotlin DSL กับ Fragment นั่นเป็นเพราะ
เมื่อส่ง NavGraph
ไปยัง Composable ของ NavHost
ให้ใช้
createGraph()
แลมบ์ดา
ดูข้อมูลเพิ่มเติมได้ที่ Fragment และ Kotlin DSL
XML
การสร้างปลายทางกิจกรรมจะคล้ายกับการสร้างส่วนย่อย ปลายทาง แต่ลักษณะของข้อมูลกิจกรรม แตกต่างกัน
โดยค่าเริ่มต้น ไลบรารีการนำทางจะแนบ NavController
ไว้กับ
Activity
และกราฟการนำทางที่ใช้งานอยู่จะกำหนดขอบเขตเป็น
Activity
หากผู้ใช้ไปที่ Activity
อื่น การตั้งค่าปัจจุบัน
กราฟการนำทางไม่ได้อยู่ในขอบเขตแล้ว ซึ่งหมายความว่า Activity
ปลายทางควรถือว่าเป็นปลายทางภายในกราฟการนำทาง
หากต้องการเพิ่มจุดหมายของกิจกรรม ให้ระบุปลายทาง Activity
ด้วย
ชื่อคลาสที่มีคุณสมบัติครบถ้วน:
<?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>
XML นี้เทียบเท่ากับการเรียกใช้ startActivity()
ต่อไปนี้
Kotlin
startActivity(Intent(context, DestinationActivity::class.java))
Java
startActivity(new Intent(context, DestinationActivity.class));
คุณอาจมีกรณีที่วิธีการนี้ไม่เหมาะสม เช่น คุณอาจไม่ได้ใช้คลาสกิจกรรมในคอมไพล์ไทม์ หรืออาจต้องการระดับการสื่อให้เข้าใจโดยอ้อมของการใช้ Intent ที่ไม่ชัด intent-filter
ในรายการไฟล์ Manifest สำหรับปลายทาง Activity
จะกำหนดโครงสร้างปลายทาง Activity
ตัวอย่างเช่น ลองพิจารณาไฟล์ Manifest ต่อไปนี้
<?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>
ปลายทาง Activity
ที่เกี่ยวข้องต้องได้รับการกําหนดค่าด้วยแอตทริบิวต์ action
และ data
ที่ตรงกับแอตทริบิวต์ในรายการไฟล์ Manifest ดังนี้
<?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>
การระบุ targetPackage
เป็น applicationId
ปัจจุบันจะจำกัด
ขอบเขตของแอปพลิเคชันปัจจุบัน ซึ่งรวมถึงแอปหลัก
คุณสามารถใช้กลไกเดียวกันนี้กับกรณีที่คุณต้องการให้แอปเฉพาะ
ปลายทาง ตัวอย่างต่อไปนี้ระบุปลายทางให้เป็นแอปที่มี
บัญชีที่ 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>
อาร์กิวเมนต์แบบไดนามิก
ตัวอย่างก่อนหน้านี้ใช้ URL แบบคงที่เพื่อไปยังปลายทาง คุณอาจ
ยังต้องรองรับ URL แบบไดนามิกที่มีการส่งข้อมูลเพิ่มเติมโดยเป็นส่วนหนึ่งของ
URL เช่น คุณอาจส่ง User-ID ใน URL ที่มีรูปแบบคล้ายกับ
https://example.com?userId=<actual user ID>
ในกรณีนี้ ให้ใช้ dataPattern
แทนแอตทริบิวต์ data
จากนั้นคุณสามารถระบุอาร์กิวเมนต์เพื่อแทนที่ตัวยึดตำแหน่งที่มีชื่อภายใน
ค่า 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>
ในตัวอย่างนี้ คุณสามารถระบุค่า userId
โดยใช้ Safe Args
หรือด้วย 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);
ตัวอย่างนี้ใช้แทน someUser
สำหรับ {userId}
และสร้างค่า URI ของ
https://example.com?userId=someUser