বিকল্পগুলির সাথে নেভিগেট করুন

যখন আপনি কোটলিন ডিএসএল ব্যবহার করে নেভিগেশন গ্রাফে কোনো অ্যাকশন সংজ্ঞায়িত করেন, তখন নেভিগেশন একটি সংশ্লিষ্ট NavAction ক্লাস তৈরি করে, যেটিতে সেই অ্যাকশনের জন্য সংজ্ঞায়িত কনফিগারেশনগুলো থাকে, যার মধ্যে নিম্নলিখিতগুলো অন্তর্ভুক্ত:

  • গন্তব্য : লক্ষ্য গন্তব্যস্থলের রিসোর্স আইডি।
  • ডিফল্ট আর্গুমেন্ট : একটি android.os.Bundle যা টার্গেট ডেস্টিনেশনের জন্য ডিফল্ট মান ধারণ করে, যদি সরবরাহ করা হয়।
  • নেভিগেশন অপশন : নেভিগেশন অপশনসমূহ, যা NavOptions হিসাবে উপস্থাপিত। এই ক্লাসে টার্গেট ডেস্টিনেশনে যাওয়া এবং সেখান থেকে ফিরে আসার জন্য সমস্ত বিশেষ কনফিগারেশন থাকে, যার মধ্যে অ্যানিমেশন রিসোর্স কনফিগারেশন, পপ বিহেভিয়ার এবং ডেস্টিনেশনটি সিঙ্গেল টপ মোডে চালু করা হবে কিনা তা অন্তর্ভুক্ত।

কম্পোজের সাথে বিকল্পগুলি

ডিফল্টরূপে, navigate() আপনার নতুন গন্তব্যকে ব্যাক স্ট্যাকে যুক্ত করে। আপনি navigate() কলে অতিরিক্ত নেভিগেশন অপশন পাস করার মাধ্যমে navigate() এর আচরণ পরিবর্তন করতে পারেন।

আপনি একটি সাধারণ ল্যাম্বডা ব্যবহার করে NavOptions এর একটি ইনস্ট্যান্স তৈরি করতে পারেন। navigate() ফাংশনে সেই আর্গুমেন্টগুলো পাস করুন, যেগুলো আপনি সাধারণত NavOptions.Builder এ স্পষ্টভাবে পাস করতেন। নিম্নলিখিত উদাহরণগুলো বিবেচনা করুন:

উদাহরণস্বরূপ, কনটেক্সটে navigate() ফাংশনে কীভাবে অপশন পাস করতে হয়, তার জন্য ব্যাক স্ট্যাক গাইডটি দেখুন।

XML সহ বিকল্পগুলি

নিম্নে একটি উদাহরণ গ্রাফ দেওয়া হলো, যেখানে দুটি স্ক্রিন এবং একটি থেকে অন্যটিতে যাওয়ার জন্য একটি অ্যাকশন রয়েছে:

<?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"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/nav_graph"
            app:startDestination="@id/a">

    <fragment android:id="@+id/a"
              android:name="com.example.myapplication.FragmentA"
              android:label="a"
              tools:layout="@layout/a">
        <action android:id="@+id/action_a_to_b"
                app:destination="@id/b"
                app:enterAnim="@anim/nav_default_enter_anim"
                app:exitAnim="@anim/nav_default_exit_anim"
                app:popEnterAnim="@anim/nav_default_pop_enter_anim"
                app:popExitAnim="@anim/nav_default_pop_exit_anim"/>
    </fragment>

    <fragment android:id="@+id/b"
              android:name="com.example.myapplication.FragmentB"
              android:label="b"
              tools:layout="@layout/b">
        <action android:id="@+id/action_b_to_a"
                app:destination="@id/a"
                app:enterAnim="@anim/nav_default_enter_anim"
                app:exitAnim="@anim/nav_default_exit_anim"
                app:popEnterAnim="@anim/nav_default_pop_enter_anim"
                app:popExitAnim="@anim/nav_default_pop_exit_anim"
                app:popUpTo="@+id/a"
                app:popUpToInclusive="true"/>
    </fragment>
</navigation>

যখন ন্যাভিগেশন গ্রাফটি ইনফ্লেট করা হয়, তখন এই অ্যাকশনগুলো পার্স করা হয় এবং গ্রাফে সংজ্ঞায়িত কনফিগারেশনসহ সংশ্লিষ্ট NavAction অবজেক্টগুলো তৈরি করা হয়। উদাহরণস্বরূপ, action_b_to_a গন্তব্য b থেকে গন্তব্য a তে নেভিগেট করা হিসেবে সংজ্ঞায়িত করা হয়েছে। এই অ্যাকশনটিতে অ্যানিমেশনের পাশাপাশি popTo বিহেভিয়ারও অন্তর্ভুক্ত রয়েছে, যা ব্যাকস্ট্যাক থেকে সমস্ত গন্তব্য মুছে ফেলে। এই সমস্ত সেটিংস NavOptions হিসেবে ক্যাপচার করা হয় এবং NavAction এর সাথে সংযুক্ত করা হয়।

এই NavAction অনুসরণ করতে, অ্যাকশনটির ID পাস করে NavController.navigate() ব্যবহার করুন, যেমনটি নিচের উদাহরণে দেখানো হয়েছে:

    navController.navigate(R.id.action_b_to_a)

প্রোগ্রামগতভাবে বিকল্পগুলি প্রয়োগ করুন

পূর্ববর্তী উদাহরণগুলিতে দেখানো হয়েছে কিভাবে ন্যাভিগেশন গ্রাফ XML-এর মধ্যে NavOptions নির্দিষ্ট করতে হয়। তবে, বিল্ড করার সময় অজানা থাকা সীমাবদ্ধতার উপর নির্ভর করে নির্দিষ্ট অপশনগুলো ভিন্ন হতে পারে। এই ধরনের ক্ষেত্রে, NavOptions অবশ্যই প্রোগ্রাম্যাটিকভাবে তৈরি এবং সেট করতে হবে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

findNavController().navigate(
R.id.action_fragmentOne_to_fragmentTwo,
null,
navOptions { // Use the Kotlin DSL for building NavOptions
    anim {
        enter = android.R.animator.fade_in
        exit = android.R.animator.fade_out
    }
  }
)

জাভা

NavController navController = NavHostFragment.findNavController(this);
  navController.navigate(
    R.id.action_fragmentOne_to_fragmentTwo,
    null,
    new NavOptions.Builder()
      .setEnterAnim(android.R.animator.fade_in)
      .setExitAnim(android.R.animator.fade_out)
      .build()
  );

এই উদাহরণটিতে navigate() ফাংশনের একটি বর্ধিত রূপ ব্যবহার করা হয়েছে এবং এতে অতিরিক্ত BundleNavOptions আর্গুমেন্ট রয়েছে। navigate() ফাংশনের সকল রূপেরই বর্ধিত সংস্করণ রয়েছে, যেগুলো একটি NavOptions আর্গুমেন্ট গ্রহণ করে।

ইমপ্লিসিট ডিপ লিঙ্কে নেভিগেট করার সময় আপনি প্রোগ্রাম্যাটিকভাবেও NavOptions প্রয়োগ করতে পারেন:

কোটলিন

findNavController().navigate(
    deepLinkUri,
    navOptions { // Use the Kotlin DSL for building NavOptions
        anim {
            enter = android.R.animator.fade_in
            exit = android.R.animator.fade_out
        }
    }
)

জাভা

NavController navController = NavHostFragment.findNavController(this);
navController.navigate(
        deepLinkUri,
        new NavOptions.Builder()
                .setEnterAnim(android.R.animator.fade_in)
                .setExitAnim(android.R.animator.fade_out)
                .build()
);

navigate() এর এই সংস্করণটি অন্তর্নিহিত ডিপ লিঙ্কের জন্য একটি Uri এবং NavOptions ইনস্ট্যান্স গ্রহণ করে।