في الرسم البياني للتنقّل، يمكن أن تكون الوجهة نشاطًا. في حين أنه من الأفضل ممارسة نشاط واحد في تطبيقك، غالبًا ما تستخدم التطبيقات والأنشطة لمكونات أو شاشة مميزة داخل التطبيق. النشاط يمكن أن تكون مفيدة في مثل هذه الحالات.
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