গন্তব্যের মধ্যে ডেটা পাস করুন

ন্যাভিগেশন আপনাকে একটি গন্তব্যের জন্য আর্গুমেন্ট সংজ্ঞায়িত করে একটি নেভিগেশন অপারেশনে ডেটা সংযুক্ত করতে দেয়। উদাহরণস্বরূপ, কোন ব্যবহারকারীকে প্রদর্শন করতে হবে তা নির্ধারণ করতে একটি ব্যবহারকারীর প্রোফাইল গন্তব্য একটি ব্যবহারকারী আইডি যুক্তি নিতে পারে।

সাধারণভাবে, আপনি দৃঢ়ভাবে শুধুমাত্র গন্তব্যগুলির মধ্যে ন্যূনতম পরিমাণ ডেটা পাস করতে পছন্দ করবেন৷ উদাহরণ স্বরূপ, অবজেক্টটি নিজেই পাস করার পরিবর্তে একটি বস্তু পুনরুদ্ধার করার জন্য আপনার একটি কী পাস করা উচিত, কারণ সমস্ত সংরক্ষিত অবস্থার জন্য মোট স্থান Android এ সীমিত। আপনি যদি প্রচুর পরিমাণে ডেটা পাস করতে চান, তাহলে ViewModel ওভারভিউতে বর্ণিত একটি ViewModel ব্যবহার করুন।

গন্তব্য আর্গুমেন্ট সংজ্ঞায়িত করুন

গন্তব্যগুলির মধ্যে ডেটা পাস করতে, প্রথমে এই পদক্ষেপগুলি অনুসরণ করে গন্তব্যে এটি যোগ করে যুক্তিটিকে সংজ্ঞায়িত করুন:

  1. ন্যাভিগেশন এডিটরে , আর্গুমেন্টটি যে গন্তব্যে আছে সেটিতে ক্লিক করুন।
  2. অ্যাট্রিবিউট প্যানেলে, Add ( + ) এ ক্লিক করুন।
  3. যুক্ত আর্গুমেন্ট লিঙ্ক উইন্ডোতে যেটি প্রদর্শিত হয়, আর্গুমেন্টের নাম, আর্গুমেন্টের ধরন, আর্গুমেন্টটি বাতিলযোগ্য কিনা এবং প্রয়োজনে একটি ডিফল্ট মান লিখুন।
  4. যোগ করুন ক্লিক করুন. লক্ষ্য করুন যে আর্গুমেন্টটি এখন অ্যাট্রিবিউট প্যানেলে আর্গুমেন্ট তালিকায় উপস্থিত হয়।
  5. এরপরে, সংশ্লিষ্ট ক্রিয়াটিতে ক্লিক করুন যা আপনাকে এই গন্তব্যে নিয়ে যায়। অ্যাট্রিবিউট প্যানেলে, আপনি এখন আর্গুমেন্ট ডিফল্ট মান বিভাগে আপনার নতুন যুক্ত যুক্তি দেখতে পাবেন।
  6. আপনি আরও দেখতে পারেন যে যুক্তিটি XML-এ যোগ করা হয়েছে। XML ভিউতে টগল করতে টেক্সট ট্যাবে ক্লিক করুন, এবং লক্ষ্য করুন যে আপনার যুক্তিটি গন্তব্যে যোগ করা হয়েছে যেটি আর্গুমেন্টটি পেয়েছে। একটি উদাহরণ নিম্নলিখিত দেখানো হয়:

     <fragment android:id="@+id/myFragment" >
         <argument
             android:name="myArg"
             app:argType="integer"
             android:defaultValue="0" />
     </fragment>
    

সমর্থিত যুক্তি প্রকার

নেভিগেশন লাইব্রেরি নিম্নলিখিত আর্গুমেন্ট প্রকার সমর্থন করে:

টাইপ অ্যাপ:আর্গ টাইপ সিনট্যাক্স ডিফল্ট মানগুলির জন্য সমর্থন রুট দ্বারা পরিচালিত বাতিলযোগ্য
পূর্ণসংখ্যা app:argType="integer" হ্যাঁ হ্যাঁ না
ভাসা app:argType="float" হ্যাঁ হ্যাঁ না
লম্বা app:argType="long" হ্যাঁ - ডিফল্ট মান সবসময় একটি 'L' প্রত্যয় দিয়ে শেষ হতে হবে (যেমন "123L")। হ্যাঁ না
বুলিয়ান app:argType="বুলিয়ান" হ্যাঁ - "সত্য" বা "মিথ্যা" হ্যাঁ না
স্ট্রিং app:argType="string" হ্যাঁ হ্যাঁ হ্যাঁ
রিসোর্স রেফারেন্স app:argType="রেফারেন্স" হ্যাঁ - ডিফল্ট মান অবশ্যই "@resourceType/resourceName" (যেমন "@style/myCustomStyle") বা "0" আকারে হতে হবে হ্যাঁ না
কাস্টম পার্সেলযোগ্য app:argType="<type>", যেখানে <type> হল Parcelable সম্পূর্ণ-যোগ্য শ্রেণীর নাম "@null" এর একটি ডিফল্ট মান সমর্থন করে। অন্যান্য ডিফল্ট মান সমর্থন করে না। না হ্যাঁ
কাস্টম সিরিয়ালাইজেবল app:argType="<type>", যেখানে <type> Serializable সম্পূর্ণ-যোগ্য শ্রেণীর নাম "@null" এর একটি ডিফল্ট মান সমর্থন করে। অন্যান্য ডিফল্ট মান সমর্থন করে না। না হ্যাঁ
কাস্টম এনাম app:argType="<type>", যেখানে <type> হল enum-এর সম্পূর্ণ-যোগ্য নাম হ্যাঁ - ডিফল্ট মান অবশ্যই অযোগ্য নামের সাথে মিলতে হবে (যেমন "SUCCESS" MyEnum.SUCCESS এর সাথে মেলে)। না না

যদি কোনো আর্গুমেন্ট টাইপ নাল মান সমর্থন করে, তাহলে আপনি android:defaultValue="@null" ব্যবহার করে নাল-এর একটি ডিফল্ট মান ঘোষণা করতে পারেন।

রুট, গভীর লিঙ্ক এবং ইউআরআই তাদের আর্গুমেন্ট সহ স্ট্রিং থেকে পার্স করা যেতে পারে। পূর্ববর্তী সারণীতে দেখানো পার্সেলেবল এবং সিরিয়ালাইজেবলের মতো কাস্টম ডেটা প্রকারগুলি ব্যবহার করে এটি সম্ভব নয়৷ কাস্টম জটিল ডেটা পাস করতে, ভিউমডেল বা ডাটাবেসের মতো ডেটা অন্য কোথাও সংরক্ষণ করুন এবং নেভিগেট করার সময় শুধুমাত্র একটি শনাক্তকারী পাস করুন; তারপর নেভিগেশন শেষ হওয়ার পরে নতুন অবস্থানে ডেটা পুনরুদ্ধার করুন।

আপনি যখন কাস্টম প্রকারগুলির মধ্যে একটি বেছে নেন, তখন নির্বাচন করুন ক্লাস ডায়ালগ উপস্থিত হয় এবং আপনাকে সেই ধরণের জন্য সংশ্লিষ্ট শ্রেণী নির্বাচন করতে অনুরোধ করে। প্রকল্প ট্যাব আপনাকে আপনার বর্তমান প্রকল্প থেকে একটি ক্লাস চয়ন করতে দেয়।

ন্যাভিগেশন লাইব্রেরি প্রদত্ত মানের উপর ভিত্তি করে ধরন নির্ধারণ করতে আপনি <অনুমানিত প্রকার> বেছে নিতে পারেন।

আর্গুমেন্টটি নির্বাচিত টাইপ মানের একটি অ্যারে হওয়া উচিত তা নির্দেশ করতে আপনি অ্যারে চেক করতে পারেন। নিম্নলিখিত নোট করুন:

  • enums এর অ্যারে এবং রিসোর্স রেফারেন্সের অ্যারে সমর্থিত নয়।
  • অন্তর্নিহিত প্রকারের বাতিলযোগ্য মানগুলির জন্য সমর্থন নির্বিশেষে অ্যারেগুলি বাতিলযোগ্য মানগুলিকে সমর্থন করে। উদাহরণ স্বরূপ, app:argType="integer[]" ব্যবহার করা আপনাকে app:nullable="true" ব্যবহার করতে দেয় যে একটি নাল অ্যারে পাস করা গ্রহণযোগ্য।
  • অ্যারে একটি একক ডিফল্ট মান সমর্থন করে, "@null"। অ্যারে অন্য কোনো ডিফল্ট মান সমর্থন করে না।

একটি কর্মে একটি গন্তব্য আর্গুমেন্ট ওভাররাইড করুন

গন্তব্য-স্তরের আর্গুমেন্ট এবং ডিফল্ট মানগুলি গন্তব্যে নেভিগেট করা সমস্ত ক্রিয়া দ্বারা ব্যবহৃত হয়। যদি প্রয়োজন হয়, আপনি অ্যাকশন লেভেলে একটি আর্গুমেন্ট সংজ্ঞায়িত করে একটি আর্গুমেন্টের ডিফল্ট মানকে ওভাররাইড করতে পারেন (অথবা এটি ইতিমধ্যে বিদ্যমান না থাকলে একটি সেট করুন)। এই যুক্তিটি অবশ্যই গন্তব্যে ঘোষিত আর্গুমেন্টের মতো একই নাম এবং প্রকারের হতে হবে৷

নিম্নলিখিত XML একটি যুক্তি সহ একটি ক্রিয়া ঘোষণা করে যা পূর্ববর্তী উদাহরণ থেকে গন্তব্য-স্তরের আর্গুমেন্টকে ওভাররাইড করে:

<action android:id="@+id/startMyFragment"
    app:destination="@+id/myFragment">
    <argument
        android:name="myArg"
        app:argType="integer"
        android:defaultValue="1" />
</action>

টাইপ সেফটি সহ ডেটা পাস করতে Safe Args ব্যবহার করুন

নেভিগেশন কম্পোনেন্টে Safe Args নামে একটি Gradle প্লাগইন রয়েছে যা টাইপ-সেফ নেভিগেশন এবং যেকোনো যুক্ত আর্গুমেন্টে অ্যাক্সেসের জন্য সহজ অবজেক্ট এবং বিল্ডার ক্লাস তৈরি করে। নিরাপদ Args দৃঢ়ভাবে নেভিগেট এবং ডেটা পাস করার জন্য সুপারিশ করা হয়, কারণ এটি ধরনের নিরাপত্তা নিশ্চিত করে।

আপনি যদি Gradle ব্যবহার না করেন, আপনি Safe Args প্লাগইন ব্যবহার করতে পারবেন না। এই ক্ষেত্রে, আপনি সরাসরি ডেটা পাস করতে Bundles ব্যবহার করতে পারেন।

আপনার প্রোজেক্টে Safe Args যোগ করতে, আপনার শীর্ষ স্তরের build.gradle ফাইলে নিম্নলিখিত classpath অন্তর্ভুক্ত করুন:

গ্রোভি

buildscript {
    repositories {
        google()
    }
    dependencies {
        def nav_version = "2.8.4"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    }
}

কোটলিন

buildscript {
    repositories {
        google()
    }
    dependencies {
        val nav_version = "2.8.4"
        classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version")
    }
}

আপনাকে অবশ্যই দুটি উপলব্ধ প্লাগইনগুলির মধ্যে একটি প্রয়োগ করতে হবে৷

জাভা বা মিশ্র জাভা এবং কোটলিন মডিউলগুলির জন্য উপযুক্ত জাভা ভাষার কোড তৈরি করতে, এই লাইনটি আপনার অ্যাপ বা মডিউলের build.gradle ফাইলে যোগ করুন:

গ্রোভি

plugins {
  id 'androidx.navigation.safeargs'
}

কোটলিন

plugins {
    id("androidx.navigation.safeargs")
}

বিকল্পভাবে, কোটলিন-কেবল মডিউলগুলির জন্য উপযুক্ত কোটলিন কোড তৈরি করতে যোগ করুন:

গ্রোভি

plugins {
  id 'androidx.navigation.safeargs.kotlin'
}

কোটলিন

plugins {
    id("androidx.navigation.safeargs.kotlin")
}

AndroidX এ স্থানান্তরিত করার জন্য আপনার gradle.properties ফাইলে android.useAndroidX=true থাকতে হবে।

আপনি সেফ আর্গস সক্ষম করার পরে, আপনার তৈরি করা কোডে প্রতিটি ক্রিয়াকলাপের পাশাপাশি প্রতিটি প্রেরণ এবং গ্রহণের গন্তব্যের জন্য নিম্নলিখিত ধরণের নিরাপদ ক্লাস এবং পদ্ধতিগুলি রয়েছে৷

  • প্রতিটি গন্তব্যের জন্য একটি শ্রেণী তৈরি করা হয় যেখানে একটি কর্মের উৎপত্তি হয়। এই শ্রেণীর নাম হল "নির্দেশ" শব্দের সাথে যুক্ত মূল গন্তব্যের নাম। উদাহরণস্বরূপ, যদি উদ্ভূত গন্তব্যটি একটি খণ্ড হয় যার নাম SpecifyAmountFragment , জেনারেট করা ক্লাসটিকে SpecifyAmountFragmentDirections বলা হয়।

    এই শ্রেণীতে প্রতিটি কর্মের জন্য একটি পদ্ধতি রয়েছে যা মূল গন্তব্যে সংজ্ঞায়িত করা হয়েছে।

  • যুক্তি পাস করার জন্য ব্যবহৃত প্রতিটি কর্মের জন্য, একটি অভ্যন্তরীণ শ্রেণী তৈরি করা হয় যার নামটি কর্মের উপর ভিত্তি করে। উদাহরণস্বরূপ, যদি ক্রিয়াটিকে confirmationAction, ক্লাসটির নাম ConfirmationAction । যদি আপনার অ্যাকশনে defaultValue ছাড়া আর্গুমেন্ট থাকে, তাহলে আপনি আর্গুমেন্টের মান সেট করতে সংশ্লিষ্ট অ্যাকশন ক্লাস ব্যবহার করেন।

  • প্রাপ্তির গন্তব্যের জন্য একটি ক্লাস তৈরি করা হয়। এই শ্রেণীর নাম "আর্গস" শব্দের সাথে যুক্ত গন্তব্যের নাম। উদাহরণস্বরূপ, যদি গন্তব্যের খণ্ডটির নাম ConfirmationFragment, উৎপন্ন শ্রেণীটিকে বলা হয় ConfirmationFragmentArgs । আর্গুমেন্ট পুনরুদ্ধার করতে এই ক্লাসের fromBundle() পদ্ধতি ব্যবহার করুন।

নিম্নলিখিত উদাহরণটি আপনাকে দেখায় কিভাবে একটি আর্গুমেন্ট সেট করতে এবং navigate() পদ্ধতিতে পাস করতে এই পদ্ধতিগুলি ব্যবহার করতে হয়:

কোটলিন

override fun onClick(v: View) {
   val amountTv: EditText = view!!.findViewById(R.id.editTextAmount)
   val amount = amountTv.text.toString().toInt()
   val action = SpecifyAmountFragmentDirections.confirmationAction(amount)
   v.findNavController().navigate(action)
}

জাভা

@Override
public void onClick(View view) {
   EditText amountTv = (EditText) getView().findViewById(R.id.editTextAmount);
   int amount = Integer.parseInt(amountTv.getText().toString());
   ConfirmationAction action =
           SpecifyAmountFragmentDirections.confirmationAction();
   action.setAmount(amount);
   Navigation.findNavController(view).navigate(action);
}

প্রাপ্তির গন্তব্যের কোডে, বান্ডেলটি পুনরুদ্ধার করতে এবং এর বিষয়বস্তু ব্যবহার করতে getArguments() পদ্ধতি ব্যবহার করুন। -ktx নির্ভরতা ব্যবহার করার সময়, Kotlin ব্যবহারকারীরা আর্গুমেন্ট অ্যাক্সেস করতে by navArgs() সম্পত্তি প্রতিনিধি ব্যবহার করতে পারেন।

কোটলিন

val args: ConfirmationFragmentArgs by navArgs()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    val tv: TextView = view.findViewById(R.id.textViewAmount)
    val amount = args.amount
    tv.text = amount.toString()
}

জাভা

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    TextView tv = view.findViewById(R.id.textViewAmount);
    int amount = ConfirmationFragmentArgs.fromBundle(getArguments()).getAmount();
    tv.setText(amount + "");
}

একটি বিশ্বব্যাপী কর্মের সাথে নিরাপদ আর্গস ব্যবহার করুন

একটি গ্লোবাল অ্যাকশনের সাথে সেফ আর্গস ব্যবহার করার সময়, আপনাকে অবশ্যই আপনার রুট <navigation> উপাদানের জন্য একটি android:id মান প্রদান করতে হবে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/main_nav"
            app:startDestination="@id/mainFragment">

    ...

</navigation>

নেভিগেশন <navigation> উপাদানের জন্য একটি Directions শ্রেণী তৈরি করে যা android:id মানের উপর ভিত্তি করে। উদাহরণস্বরূপ, যদি আপনার কাছে android:id=@+id/main_nav এর সাথে একটি <navigation> উপাদান থাকে, তাহলে জেনারেট করা ক্লাসটিকে MainNavDirections বলা হয়। <navigation> উপাদানের মধ্যে সমস্ত গন্তব্যগুলি পূর্ববর্তী বিভাগে বর্ণিত একই পদ্ধতিগুলি ব্যবহার করে সমস্ত সম্পর্কিত বিশ্বব্যাপী অ্যাকশন অ্যাক্সেস করার পদ্ধতি তৈরি করেছে।

বান্ডেল অবজেক্টের সাথে গন্তব্যের মধ্যে ডেটা পাস করুন

আপনি যদি Gradle ব্যবহার না করেন, তাহলেও আপনি Bundle অবজেক্ট ব্যবহার করে গন্তব্যের মধ্যে আর্গুমেন্ট পাস করতে পারেন। একটি Bundle অবজেক্ট তৈরি করুন এবং navigate() ব্যবহার করে এটিকে গন্তব্যে পাঠান, যেমন নিম্নলিখিত উদাহরণে:

কোটলিন

val bundle = bundleOf("amount" to amount)
view.findNavController().navigate(R.id.confirmationAction, bundle)

জাভা

Bundle bundle = new Bundle();
bundle.putString("amount", amount);
Navigation.findNavController(view).navigate(R.id.confirmationAction, bundle);

আপনার গন্তব্যের কোডে, Bundle পুনরুদ্ধার করতে এবং এর বিষয়বস্তু ব্যবহার করতে getArguments() পদ্ধতি ব্যবহার করুন:

কোটলিন

val tv = view.findViewById<TextView>(R.id.textViewAmount)
tv.text = arguments?.getString("amount")

জাভা

TextView tv = view.findViewById(R.id.textViewAmount);
tv.setText(getArguments().getString("amount"));

শুরুর গন্তব্যে ডেটা পাস করুন

আপনি আপনার অ্যাপের শুরুর গন্তব্যে ডেটা পাঠাতে পারেন। প্রথমত, আপনাকে অবশ্যই স্পষ্টভাবে একটি Bundle তৈরি করতে হবে যা ডেটা ধারণ করে। এর পরে, Bundle শুরুর গন্তব্যে যেতে নিম্নলিখিত পদ্ধতিগুলির মধ্যে একটি ব্যবহার করুন:

  • আপনি যদি আপনার NavHost প্রোগ্রাম্যাটিকভাবে তৈরি করেন, NavHostFragment.create(R.navigation.graph, args) কল করুন, যেখানে args হল Bundle যা আপনার ডেটা ধারণ করে।
  • অন্যথায়, আপনি NavController.setGraph() এর নিম্নলিখিত ওভারলোডগুলির মধ্যে একটিতে কল করে গন্তব্য আর্গুমেন্ট শুরু করতে পারেন:

আপনার শুরুর গন্তব্যে ডেটা পুনরুদ্ধার করতে, Fragment.getArguments() কল করুন।

ProGuard বিবেচনা

আপনি যদি আপনার কোড সঙ্কুচিত করে থাকেন, তাহলে আপনাকে আপনার Parcelable , Serializable , এবং Enum ক্লাসের নামগুলি মিনিফিকেশন প্রক্রিয়ার অংশ হিসাবে অস্পষ্ট হওয়া থেকে আটকাতে হবে৷ আপনি দুটি উপায়ে এটি করতে পারেন:

  • @Keep টীকা ব্যবহার করুন।
  • Keepnames নিয়ম ব্যবহার করুন.

নিম্নলিখিত উপধারাগুলি এই পদ্ধতির রূপরেখা দেয়।

@Keep টীকা ব্যবহার করুন

নিম্নলিখিত উদাহরণ মডেল ক্লাস সংজ্ঞায় @Keep টীকা যোগ করে:

কোটলিন

@Keep class ParcelableArg : Parcelable { ... }

@Keep class SerializableArg : Serializable { ... }

@Keep enum class EnumArg { ... }

জাভা

@Keep public class ParcelableArg implements Parcelable { ... }

@Keep public class SerializableArg implements Serializable { ... }

@Keep public enum EnumArg { ... }

Keepnames নিয়ম ব্যবহার করুন

এছাড়াও আপনি আপনার proguard-rules.pro ফাইলে keepnames নিয়ম যোগ করতে পারেন, যেমনটি নিচের উদাহরণে দেখানো হয়েছে:

proguard-rules.pro

...

-keepnames class com.path.to.your.ParcelableArg
-keepnames class com.path.to.your.SerializableArg
-keepnames class com.path.to.your.EnumArg

...

অতিরিক্ত সম্পদ

নেভিগেশন সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত সংস্থানগুলি দেখুন৷

নমুনা

কোডল্যাব

ভিডিও