डेटा को एक डेस्टिनेशन से दूसरे डेस्टिनेशन पर भेजें

नेविगेशन की मदद से, आर्ग्युमेंट तय करके किसी नेविगेशन ऑपरेशन में डेटा अटैच किया जा सकता है पर जाएं. उदाहरण के लिए, एक उपयोगकर्ता प्रोफ़ाइल गंतव्य एक उपयोगकर्ता आईडी ले सकता है का इस्तेमाल करें.

आम तौर पर, आपको सिर्फ़ कम से कम डेटा पास करना चाहिए के बीच दिखता है. उदाहरण के लिए, किसी ऑब्जेक्ट को वापस पाने के लिए आपको एक कुंजी पास करनी चाहिए अपने आप को पास करने के बजाय, सभी सहेजे गए राज्यों के लिए कुल स्थान के रूप में यह सुविधा Android पर सीमित तौर पर उपलब्ध है. अगर आपको ज़्यादा डेटा भेजना है, तो ViewModel जैसा कि इसमें बताया गया है ViewModel की खास जानकारी.

डेस्टिनेशन के आर्ग्युमेंट के बारे में बताएं

डेटा को एक डेस्टिनेशन से दूसरे डेस्टिनेशन के बीच भेजने के लिए, सबसे पहले आर्ग्युमेंट को गंतव्य जो इन चरणों का पालन करके इसे प्राप्त करता है:

  1. नेविगेशन एडिटर में, आर्ग्युमेंट पाने वाले डेस्टिनेशन पर क्लिक करें.
  2. एट्रिब्यूट पैनल में, जोड़ें (+) पर क्लिक करें.
  3. स्क्रीन पर दिखने वाली अर्ग्यूमेंट लिंक जोड़ें विंडो में, आर्ग्युमेंट का नाम डालें. तर्क का टाइप, क्या तर्क शून्य होने लायक है और डिफ़ॉल्ट वैल्यू, अगर की ज़रूरत नहीं है.
  4. जोड़ें पर क्लिक करें. ध्यान दें कि यह आर्ग्युमेंट अब आर्ग्युमेंट में दिखता है एट्रिब्यूट पैनल में दी गई सूची बनाएं.
  5. इसके बाद, उस कार्रवाई पर क्लिक करें जो आपको इस डेस्टिनेशन पर ले जाती है. एट्रिब्यूट पैनल में, अब आपको जोड़ा गया नया आर्ग्युमेंट दिखेगा आर्ग्यूमेंट की डिफ़ॉल्ट वैल्यू सेक्शन में.
  6. यह भी देखा जा सकता है कि तर्क को एक्सएमएल में जोड़ा गया था. टेक्स्ट टैब पर क्लिक करें एक्सएमएल व्यू में टॉगल करें. साथ ही, ध्यान दें कि आपका आर्ग्युमेंट आर्ग्युमेंट पाने वाला डेस्टिनेशन. इसका एक उदाहरण यहां दिया गया है:

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

आर्ग्युमेंट के वे टाइप जो इसके साथ काम करते हैं

नेविगेशन लाइब्रेरी में, यहां दिए गए आर्ग्युमेंट टाइप इस्तेमाल किए जा सकते हैं:

टाइप ऐप्लिकेशन:आर्गटाइप सिंटैक्स डिफ़ॉल्ट वैल्यू के साथ काम करता है रास्तों के हिसाब से मैनेज किया जाता है शून्य योग्य
पूर्णांक ऐप्लिकेशन:orgType="integer" हां हां नहीं
फ़्लोट ऐप्लिकेशन:अर्गटाइप="फ़्लोट" हां हां नहीं
ज़्यादा समय के लिए ऐप्लिकेशन:अर्गटाइप="लॉन्ग" हां - डिफ़ॉल्ट वैल्यू के आखिर में हमेशा 'L' होना चाहिए प्रत्यय (जैसे कि "123L"). हां नहीं
बूलियन ऐप्लिकेशन:orgType="बूलियन" हां - "सही" या "गलत" हां नहीं
स्ट्रिंग ऐप्लिकेशन:अर्गटाइप="स्ट्रिंग" हां हां हां
संसाधन का रेफ़रंस ऐप्लिकेशन:orgType="reference" हां - डिफ़ॉल्ट वैल्यू "@resourceType/resourceName" के रूप में होनी चाहिए (उदाहरण के लिए, "@style/myCustomStyle") या "0" हां नहीं
पसंद के मुताबिक पार्स किया जा सकने वाला एट्रिब्यूट app:orgType="<type>", जहां <type> यह Parcelable की पूरी तरह क्वालिफ़ाइड क्लास का नाम है "@null" की डिफ़ॉल्ट वैल्यू इस्तेमाल की जा सकती है. अन्य डिफ़ॉल्ट वैल्यू के साथ काम नहीं किया जा सकता. नहीं हां
कस्टम क्रम से लगाया जा सकता है app:orgType="<type>", जहां <type> यह Serializable की पूरी तरह क्वालिफ़ाइड क्लास का नाम है "@null" की डिफ़ॉल्ट वैल्यू इस्तेमाल की जा सकती है. अन्य डिफ़ॉल्ट वैल्यू के साथ काम नहीं किया जा सकता. नहीं हां
पसंद के मुताबिक Enum app:orgType="<type>", जहां <type> ईनम का पूरी तरह क्वालिफ़ाइड नाम है हां - डिफ़ॉल्ट वैल्यू, उन नाम से मेल खानी चाहिए जो सही नहीं हैं (उदाहरण के लिए, MyEnum. हटाने के लिए "सफल"). नहीं नहीं

अगर कोई आर्ग्युमेंट टाइप शून्य वैल्यू के साथ काम करता है, तो android:defaultValue="@null" का इस्तेमाल करके अमान्य कर दिया गया है.

रूट, डीप लिंक, और यूआरआई को उनके आर्ग्युमेंट के साथ स्ट्रिंग से पार्स किया जा सकता है. कस्टम डेटा टाइप का इस्तेमाल नहीं किया जा सकता. जैसे, पार्सलेबल और क्रम से लगाई जा सकने वाली वैल्यू, जैसा कि पिछली टेबल में दिया गया है. कस्टम जटिल डेटा को पास करने के लिए, डेटा को ViewModel जैसी जगहों पर सेव करें या डेटाबेस और नेविगेट करते समय ही आइडेंटिफ़ायर पास करें; तो नेविगेशन पूरा होने के बाद नई जगह में डेटा को फिर से पाएं.

अपनी पसंद का कोई टाइप चुनने पर, क्लास चुनें डायलॉग दिखेगा और आपको उस टाइप के हिसाब से क्लास चुनने का निर्देश देता है. प्रोजेक्ट टैब से अपने मौजूदा प्रोजेक्ट से क्लास चुनी जा सकती है.

नेविगेशन लाइब्रेरी पाने के लिए <inफ़र्ड type> को चुनें दी गई वैल्यू के आधार पर टाइप तय करता है.

Array की जांच करके यह बताया जा सकता है कि आर्ग्युमेंट, टाइप वैल्यू चुनी गई. यहां दी गई बातों का ध्यान रखें:

  • ईनम की कैटगरी और रिसॉर्स रेफ़रंस के अरे का इस्तेमाल नहीं किया जा सकता.
  • सारणियां शून्य मान वाले मान के साथ काम करती हैं, भले ही वे शून्य करने लायक के लिए काम कर रहे हों वैल्यू दी गई हैं. उदाहरण के लिए, app:argType="integer[]", आपको इन कामों के लिए app:nullable="true" का इस्तेमाल करने की सुविधा देता है यह बताएं कि शून्य अरे को पास करना सही है.
  • सरणियों से एक डिफ़ॉल्ट वैल्यू, "@null" का इस्तेमाल किया जा सकता है. कोई भी सरणियों के साथ काम नहीं करता है अन्य डिफ़ॉल्ट वैल्यू.

किसी कार्रवाई में डेस्टिनेशन आर्ग्युमेंट को बदलें

डेस्टिनेशन लेवल के आर्ग्युमेंट और डिफ़ॉल्ट वैल्यू का इस्तेमाल, उन सभी कार्रवाइयों में किया जाता है जिन्हें मंज़िल पर नेविगेट करें. ज़रूरत पड़ने पर, किसी (या अगर यह पहले से मौजूद न हो, तो एक सेट करें) कार्रवाई लेवल. इस आर्ग्युमेंट का नाम और टाइप एक ही होना चाहिए गंतव्य में बताया गया है.

यह एक्सएमएल एक ऐसे तर्क के साथ कार्रवाई के बारे में बताता है जो पिछले उदाहरण में डेस्टिनेशन-लेवल आर्ग्युमेंट:

<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 प्लग इन होता है, जो टाइप-सेफ़ नेविगेशन और किसी भी डेटा को ऐक्सेस करने के लिए, इस्तेमाल में आसान ऑब्जेक्ट और बिल्डर क्लास संबंधित आर्ग्युमेंट. नेविगेट करने और नेविगेट करने के लिए, Safe Args का सुझाव दिया जाता है डेटा पास करना, क्योंकि यह पक्का करता है कि डेटा सुरक्षित है.

अगर Gradle का इस्तेमाल नहीं किया जा रहा है, तो Args प्लगिन. इन मामलों में, बंडल का इस्तेमाल सीधे पास डेटा.

如需将 Safe Args 添加到您的项目,请在顶层 build.gradle 文件中包含以下 classpath

Groovy

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

Kotlin

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

您还必须应用以下两个可用插件之一。

如需生成适用于 Java 模块或 Java 和 Kotlin 混合模块的 Java 语言代码,请将以下行添加到应用或模块build.gradle 文件中:

Groovy

plugins {
  id 'androidx.navigation.safeargs'
}

Kotlin

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

此外,如需生成仅适用于 Kotlin 模块的 Kotlin 语言代码,请添加以下行:

Groovy

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

Kotlin

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

根据迁移到 AndroidX 文档,您的 gradle.properties 文件中必须具有 android.useAndroidX=true

Safe Args चालू करने के बाद, आपके जनरेट किए गए कोड में ये चीज़ें शामिल होंगी हर कार्रवाई के लिए, सुरक्षित क्लास और तरीके टाइप करें. साथ ही, हर कार्रवाई के लिए सुरक्षित क्लास और तरीके टाइप करें और पाने वाला गंतव्य.

  • हर उस डेस्टिनेशन के लिए एक क्लास बनाई जाती है जहां से कोई कार्रवाई शुरू होती है. नाम इस क्लास का मूल गंतव्य "दिशा-निर्देश" शब्द का इस्तेमाल करें. उदाहरण के लिए, अगर ओरिजनल डेस्टिनेशन कोई फ़्रैगमेंट है इसका नाम SpecifyAmountFragment है, तो जनरेट की गई क्लास को कॉल किया जाता है SpecifyAmountFragmentDirections.

    इस क्लास में हर कार्रवाई के लिए एक तरीका होता है. गंतव्य.

  • तर्क को पास करने के लिए इस्तेमाल की जाने वाली हर कार्रवाई के लिए, एक इनर क्लास बनाई जाती है जिसका नाम कार्रवाई के आधार पर तय होता है. उदाहरण के लिए, अगर कार्रवाई को confirmationAction, क्लास का नाम ConfirmationAction है. अगर आपके कार्रवाई में बिना defaultValue के तर्क शामिल होते हैं, तो आप आर्ग्युमेंट की वैल्यू सेट करने के लिए, असोसिएटेड ऐक्शन क्लास का इस्तेमाल करें.

  • पाने वाले डेस्टिनेशन के लिए एक क्लास बनाई गई. इस क्लास का नाम है डेस्टिनेशन के नाम के साथ "Args" शब्द जुड़ा होना चाहिए. उदाहरण के लिए, अगर डेस्टिनेशन फ़्रैगमेंट का नाम ConfirmationFragment, है, जो जनरेट किया गया है क्लास का नाम ConfirmationFragmentArgs है. इस क्लास के fromBundle() का इस्तेमाल करें विधि का इस्तेमाल करके आर्ग्युमेंट वापस पाएं.

नीचे दिए गए उदाहरण में, तर्क सेट करने और इसे navigate() को पास करो तरीका:

Kotlin

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)
}

Java

@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() प्रॉपर्टी डेलिगेट का भी इस्तेमाल कर सकते हैं आर्ग्युमेंट.

Kotlin

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()
}

Java

@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 + "");
}

ग्लोबल ऐक्शन के लिए, Safe Args का इस्तेमाल करें

Safe Args का इस्तेमाल करते समय ग्लोबल ऐक्शन, आपको अपने रूट <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 वैल्यू के आधार पर. उदाहरण के लिए, अगर आपके पास <navigation> है एलिमेंट android:id=@+id/main_nav है, तो जनरेट की गई क्लास को कॉल किया जाता है MainNavDirections. <navigation> एलिमेंट में मौजूद सभी डेस्टिनेशन में सभी संबंधित ग्लोबल ऐक्शन को ऐक्सेस करने के लिए जनरेट किए गए तरीके दिए गए तरीके का इस्तेमाल करें.

बंडल ऑब्जेक्ट वाले डेस्टिनेशन के बीच डेटा पास करना

अगर Gradle का इस्तेमाल नहीं किया जा रहा है, तो अब भी डेस्टिनेशन के बीच आर्ग्युमेंट को Bundle ऑब्जेक्ट का इस्तेमाल करके. Bundle ऑब्जेक्ट बनाएं और उसे डेस्टिनेशन पर भेजें navigate() का इस्तेमाल करें, जैसा कि इस उदाहरण में दिखाया गया है:

Kotlin

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

Java

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

पाने वाले डेस्टिनेशन के कोड में, getArguments() तरीके का इस्तेमाल करके Bundle को फिर से पाएं और इसकी सामग्री का इस्तेमाल करें:

Kotlin

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

Java

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 एनोटेशन जोड़े गए हैं:

Kotlin

@Keep class ParcelableArg : Parcelable { ... }

@Keep class SerializableArg : Serializable { ... }

@Keep enum class EnumArg { ... }

Java

@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

...

अन्य संसाधन

नेविगेशन के बारे में ज़्यादा जानने के लिए, इनकी मदद लें अतिरिक्त संसाधन शामिल करें.

सैंपल

कोड लैब

वीडियो