وجهات الأنشطة

في الرسم البياني للتنقّل، يمكن أن تكون الوجهة نشاطًا. في حين أنه من الأفضل أن يكون لديك نشاط واحد في تطبيقك، غالبًا ما تستخدم التطبيقات أنشطة منفصلة لمكونات أو شاشات مختلفة داخل التطبيق. يمكن أن تكون وجهات النشاط مفيدة في مثل هذه الحالات.

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.