কার্যকলাপ গন্তব্য

আপনার নেভিগেশন গ্রাফে, একটি গন্তব্য একটি কার্যকলাপ হতে পারে। যদিও আপনার অ্যাপে একটি একক ক্রিয়াকলাপ থাকা সর্বোত্তম অনুশীলন, অ্যাপগুলি প্রায়শই একটি অ্যাপের মধ্যে স্বতন্ত্র উপাদান বা স্ক্রিনের জন্য পৃথক কার্যকলাপ ব্যবহার করে। কার্যকলাপ গন্তব্য এই ধরনের ক্ষেত্রে দরকারী হতে পারে.

রচনা এবং Kotlin DSL

আপনার নেভিগেশন গ্রাফে একটি কার্যকলাপের গন্তব্য যোগ করা মূলত একই রকম হয় যখন রচনা করুন এবং যখন টুকরো টুকরো সহ Kotlin DSL ব্যবহার করুন। এর কারণ হল আপনার NavGraph আপনার NavHost কম্পোজেবলে পাস করার সময়, আপনি একই createGraph() lambda ব্যবহার করেন।

আরও তথ্যের জন্য, ফ্র্যাগমেন্টস এবং কোটলিন ডিএসএল দেখুন।

এক্সএমএল

একটি কার্যকলাপ গন্তব্য তৈরি করা একটি খণ্ড গন্তব্য তৈরির অনুরূপ। যাইহোক, একটি কার্যকলাপ গন্তব্য প্রকৃতি বেশ ভিন্ন.

ডিফল্টরূপে, নেভিগেশন লাইব্রেরি 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 নিম্নলিখিত কল to 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>

বর্তমান applicationId আইডিতে targetPackage নির্দিষ্ট করা বর্তমান অ্যাপ্লিকেশনের সুযোগকে সীমিত করে, যার মধ্যে প্রধান অ্যাপ রয়েছে।

একই প্রক্রিয়াটি এমন ক্ষেত্রে ব্যবহার করা যেতে পারে যেখানে আপনি একটি নির্দিষ্ট অ্যাপকে গন্তব্য হতে চান। নিম্নলিখিত উদাহরণটি 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>

গতিশীল আর্গুমেন্ট

পূর্ববর্তী উদাহরণগুলি গন্তব্যে নেভিগেট করতে স্থির URL ব্যবহার করেছে৷ আপনাকে ডায়নামিক ইউআরএল সমর্থন করতে হতে পারে যেখানে ইউআরএলের অংশ হিসেবে অতিরিক্ত তথ্য পাঠানো হয়। উদাহরণ স্বরূপ, আপনি https://example.com?userId=<actual user ID> এর মত বিন্যাস সহ একটি URL-এ একটি ব্যবহারকারী আইডি পাঠাতে পারেন।

এই ক্ষেত্রে, 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>

এই উদাহরণে, আপনি নিরাপদ আর্গস বা 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 মান তৈরি করে।