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