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