در نمودار ناوبری شما، مقصد می تواند یک فعالیت باشد. در حالی که بهترین تمرین این است که یک فعالیت واحد در برنامه خود داشته باشید، برنامه ها اغلب از فعالیت های جداگانه برای اجزای متمایز یا صفحه نمایش در یک برنامه استفاده می کنند. مقاصد فعالیت می تواند در چنین مواردی مفید باشد.
Compose و Kotlin DSL
افزودن یک مقصد فعالیت به نمودار ناوبری شما اساساً در Compose و هنگام استفاده از Kotlin DSL با قطعات یکسان است. این به این دلیل است که هنگام ارسال NavGraph
خود به NavHost
composable خود، از همان createGraph()
lambda استفاده می کنید.
برای اطلاعات بیشتر، Fragments and Kotlin DSL را ببینید.
XML
ایجاد یک مقصد فعالیت مشابه ایجاد یک مقصد قطعه است. با این حال، ماهیت یک مقصد فعالیت کاملاً متفاوت است.
بهطور پیشفرض، کتابخانه Navigation 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()
است:
کاتلین
startActivity(Intent(context, DestinationActivity::class.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>
ارسال کنید.
در این حالت، به جای ویژگی data
، از dataPattern
استفاده کنید. سپس میتوانید آرگومانهایی را برای جایگزینی مکاندارهای نامگذاری شده در مقدار 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
را با استفاده از Safe Args یا با یک Bundle
مشخص کنید:
کاتلین
navController.navigate(
R.id.localDestinationActivity,
bundleOf("userId" to "someUser")
)
جاوا
Bundle args = new Bundle();
args.putString("userId", "someUser");
navController.navigate(R.id.localDestinationActivity, args);
این مثال someUser
را جایگزین {userId}
میکند و یک مقدار URI از https://example.com?userId=someUser
ایجاد میکند.