আপনার নেভিগেশন গ্রাফে, একটি ডেস্টিনেশন একটি অ্যাক্টিভিটি হতে পারে। যদিও আপনার অ্যাপে একটিমাত্র অ্যাক্টিভিটি থাকাই সর্বোত্তম পন্থা, অ্যাপগুলো প্রায়শই একটি অ্যাপের মধ্যেকার স্বতন্ত্র কম্পোনেন্ট বা স্ক্রিনের জন্য আলাদা অ্যাক্টিভিটি ব্যবহার করে থাকে। এই ধরনের ক্ষেত্রে অ্যাক্টিভিটি ডেস্টিনেশন বেশ কার্যকর হতে পারে।
কম্পোজ এবং কোটলিন ডিএসএল
আপনার ন্যাভিগেশন গ্রাফে একটি অ্যাক্টিভিটি ডেস্টিনেশন যোগ করার পদ্ধতিটি কম্পোজ এবং ফ্র্যাগমেন্টের সাথে কোটলিন ডিএসএল ব্যবহার করার ক্ষেত্রে মূলত একই। এর কারণ হলো, আপনার NavHost কম্পোজেবলে NavGraph পাস করার সময়, আপনি একই createGraph() ল্যাম্বডা ব্যবহার করেন।
আরও তথ্যের জন্য, Fragments এবং Kotlin DSL দেখুন।
এক্সএমএল
একটি অ্যাক্টিভিটি ডেস্টিনেশন তৈরি করার পদ্ধতি একটি ফ্র্যাগমেন্ট ডেস্টিনেশন তৈরি করার মতোই। তবে, একটি অ্যাক্টিভিটি ডেস্টিনেশনের প্রকৃতি বেশ ভিন্ন।
ডিফল্টরূপে, নেভিগেশন লাইব্রেরি একটি Activity লেআউটের সাথে NavController কে সংযুক্ত করে এবং সক্রিয় নেভিগেশন গ্রাফটি সেই সক্রিয় 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));
এমন পরিস্থিতিও আসতে পারে যেখানে এই পদ্ধতিটি উপযুক্ত নয়। উদাহরণস্বরূপ, অ্যাক্টিভিটি ক্লাসের উপর আপনার কোনো কম্পাইল-টাইম নির্ভরতা নাও থাকতে পারে, অথবা আপনি একটি ইমপ্লিসিট ইনটেন্টের মাধ্যমে যাওয়ার পরোক্ষ প্রক্রিয়াটি পছন্দ করতে পারেন। গন্তব্য Activity জন্য ম্যানিফেস্ট এন্ট্রিতে থাকা intent-filter নির্ধারণ করে দেয় যে আপনাকে 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 নির্দিষ্ট করলে এর পরিধি বর্তমান অ্যাপ্লিকেশনের মধ্যে সীমাবদ্ধ থাকে, যার মধ্যে মূল অ্যাপটি অন্তর্ভুক্ত।
যেসব ক্ষেত্রে আপনি একটি নির্দিষ্ট অ্যাপকে গন্তব্য হিসেবে চান, সেখানেও একই পদ্ধতি ব্যবহার করা যেতে পারে। নিম্নলিখিত উদাহরণটিতে com.example.android.another.app applicationId সহ একটি অ্যাপকে গন্তব্য হিসেবে সংজ্ঞায়িত করা হয়েছে।
<?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>
গতিশীল যুক্তি
পূর্ববর্তী উদাহরণগুলিতে গন্তব্যে যাওয়ার জন্য নির্দিষ্ট ইউআরএল ব্যবহার করা হয়েছিল। আপনার ডাইনামিক ইউআরএল সমর্থন করারও প্রয়োজন হতে পারে, যেখানে ইউআরএল-এর অংশ হিসেবে অতিরিক্ত তথ্য পাঠানো হয়। উদাহরণস্বরূপ, আপনি 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>
এই উদাহরণে, আপনি সেফ আর্গস (Safe Args) অথবা Bundle ব্যবহার করে একটি userId ভ্যালু নির্দিষ্ট করতে পারেন:
কোটলিন
navController.navigate(
R.id.localDestinationActivity,
bundleOf("userId" to "someUser")
)
জাভা
Bundle args = new Bundle();
args.putString("userId", "someUser");
navController.navigate(R.id.localDestinationActivity, args);
এই উদাহরণে {userId} এর জায়গায় someUser বসানো হয়েছে এবং https://example.com?userId=someUser নামের একটি URI ভ্যালু তৈরি করা হয়েছে।