في الرسم البياني للتنقل، يمكن أن تكون الوجهة نشاطًا. في حين أنه من الأفضل ممارسة نشاط واحد في تطبيقك، غالبًا ما تستخدم التطبيقات والأنشطة لمكونات أو شاشة مميزة داخل التطبيق. النشاط يمكن أن تكون مفيدة في مثل هذه الحالات.
Compose وKotlin DSL
إضافة وجهة نشاط إلى الرسم البياني للتنقل هي في الأساس نفس الشيء
في كل من Compose وعند استخدام Kotlin DSL مع أجزاء. هذا بسبب
عند تمرير NavGraph
إلى NavHost
القابل للإنشاء، تستخدم
createGraph()
لمدا.
لمزيد من المعلومات، يمكنك الاطّلاع على مقالة إنشاء رسم بياني آليًا باستخدام لغة 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-filter
في إدخال البيان للوجهة Activity
يحدد كيفية تنظيم بنية وجهة Activity
.
على سبيل المثال، إليك ملف البيان التالي:
<?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
المطابقة لتلك الواردة في إدخال البيان:
<?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. على سبيل المثال، يمكنك إرسال رقم تعريف المستخدم في عنوان 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
باستخدام الوسيطات الآمنة.
أو باستخدام 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