व्यू बाइंडिंग Android Jetpack का हिस्सा है.

व्यू बाइंडिंग एक ऐसी सुविधा है जिसकी मदद से, इंटरैक्ट करने वाले कोड को आसानी से लिखा जा सकता है देखे जाने की संख्या. किसी मॉड्यूल में व्यू बाइंडिंग चालू होने पर, यह एक बाइंडिंग' जनरेट करती है क्लास का इस्तेमाल करें. बाइंडिंग का एक इंस्टेंस क्लास में उन सभी व्यू के सीधे रेफ़रंस शामिल होते हैं, जिनमें संबंधित लेआउट.

ज़्यादातर मामलों में, व्यू बाइंडिंग, findViewById की जगह ले लेते हैं.

सेटअप

व्यू बाइंडिंग, हर मॉड्यूल के हिसाब से चालू होती है. व्यू बाइंडिंग को चालू करने के लिए मॉड्यूल की मदद से, मॉड्यूल-लेवल में viewBinding बिल्ड विकल्प को true पर सेट करें build.gradle फ़ाइल, जैसा कि इस उदाहरण में दिखाया गया है:

ग्रूवी

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

Kotlin

android {
    ...
    buildFeatures {
        viewBinding = true
    }
}

अगर आपको बाइंडिंग क्लास जनरेट करते समय किसी लेआउट फ़ाइल को अनदेखा करना है, तो उस लेआउट के रूट व्यू के लिए tools:viewBindingIgnore="true" एट्रिब्यूट फ़ाइल:

<LinearLayout
        ...
        tools:viewBindingIgnore="true" >
    ...
</LinearLayout>

इस्तेमाल

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

उदाहरण के लिए, result_profile.xml नाम की लेआउट फ़ाइल देखें जिसमें निम्न:

<LinearLayout ... >
    <TextView android:id="@+id/name" />
    <ImageView android:cropToPadding="true" />
    <Button android:id="@+id/button"
        android:background="@drawable/rounded_button" />
</LinearLayout>

जनरेट की गई बाइंडिंग क्लास को ResultProfileBinding कहा जाता है. इस कक्षा में दो हैं फ़ील्ड: name नाम का TextView और button नाम का Button. कॉन्टेंट बनाने लेआउट में ImageView का कोई आईडी नहीं है, इसलिए इसमें इसका कोई रेफ़रंस नहीं है बाइंडिंग क्लास.

हर बाइंडिंग क्लास में एक getRoot() तरीका भी शामिल होता है, जो डायरेक्ट संबंधित लेआउट फ़ाइल के रूट व्यू के लिए रेफ़रंस. इस उदाहरण में, ResultProfileBinding क्लास में getRoot() तरीका LinearLayout रूट व्यू.

नीचे दिए गए सेक्शन में, जनरेट की गई बाइंडिंग क्लास के इस्तेमाल के बारे में बताया गया है ऐक्टिविटी और फ़्रैगमेंट.

गतिविधियों में व्यू बाइंडिंग का इस्तेमाल करना

किसी गतिविधि के साथ इस्तेमाल करने के लिए बाइंडिंग क्लास का इंस्टेंस सेट अप करने के लिए, यह करें गतिविधि की सेटिंग में जाकर, onCreate() तरीका:

  1. जनरेट किए गए बाइंडिंग क्लास में शामिल स्टैटिक inflate() तरीके को कॉल करें. यह गतिविधि के लिए बाइंडिंग क्लास का एक इंस्टेंस बनाता है.
  2. रूट व्यू का रेफ़रंस पाने के लिए, getRoot() तरीका पर कॉल करें या Kotlin प्रॉपर्टी का इस्तेमाल करना सिंटैक्स का इस्तेमाल करते हैं.
  3. रूट व्यू को पास करें setContentView() ताकि उसे स्क्रीन पर एक्टिव व्यू बनाया जा सके.

यह तरीका नीचे दिए गए उदाहरण में दिखाया गया है:

Kotlin

private lateinit var binding: ResultProfileBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ResultProfileBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)
}

Java

private ResultProfileBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ResultProfileBinding.inflate(getLayoutInflater());
    View view = binding.getRoot();
    setContentView(view);
}

अब किसी भी व्यू का रेफ़रंस देने के लिए, बाइंडिंग क्लास के इंस्टेंस का इस्तेमाल किया जा सकता है:

Kotlin

binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }

Java

binding.name.setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
    viewModel.userClicked()
});

फ़्रैगमेंट में व्यू बाइंडिंग का इस्तेमाल करना

फ़्रैगमेंट के साथ इस्तेमाल करने के लिए बाइंडिंग क्लास का इंस्टेंस सेट अप करने के लिए, फ़्रैगमेंट के onCreateView() तरीका:

  1. जनरेट किए गए बाइंडिंग क्लास में शामिल स्टैटिक inflate() तरीके को कॉल करें. यह फ़्रैगमेंट का इस्तेमाल करने के लिए, बाइंडिंग क्लास का एक इंस्टेंस बनाता है.
  2. रूट व्यू का रेफ़रंस पाने के लिए, getRoot() तरीका पर कॉल करें या Kotlin प्रॉपर्टी का इस्तेमाल करना सिंटैक्स का इस्तेमाल करते हैं.
  3. इसे बनाने के लिए, onCreateView() तरीके की मदद से रूट व्यू पर वापस जाएं स्क्रीन पर ऐक्टिव व्यू.

Kotlin

private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = ResultProfileBinding.inflate(inflater, container, false)
    val view = binding.root
    return view
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}

Java

private ResultProfileBinding binding;

@Override
public View onCreateView (LayoutInflater inflater,
                          ViewGroup container,
                          Bundle savedInstanceState) {
    binding = ResultProfileBinding.inflate(inflater, container, false);
    View view = binding.getRoot();
    return view;
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    binding = null;
}

अब किसी भी व्यू का रेफ़रंस देने के लिए, बाइंडिंग क्लास के इंस्टेंस का इस्तेमाल किया जा सकता है:

Kotlin

binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }

Java

binding.name.setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
    viewModel.userClicked()
});

अलग-अलग कॉन्फ़िगरेशन के लिए संकेत दें

कई कॉन्फ़िगरेशन में व्यू का एलान करने पर, कभी-कभी यह कोई दूसरा व्यू टाइप इस्तेमाल करना चाहिए. नीचे दिया गया कोड स्निपेट इसका एक उदाहरण दिखाता है:

# in res/layout/example.xml

<TextView android:id="@+id/user_bio" />

# in res/layout-land/example.xml

<EditText android:id="@+id/user_bio" />

इस मामले में, जनरेट की गई क्लास में फ़ील्ड userBio दिखे TextView टाइप का है, क्योंकि TextView एक सामान्य बेस क्लास है. इस वजह से तकनीकी सीमाएं हैं, तो व्यू बाइंडिंग कोड जनरेटर इसे तय नहीं कर सकता और इसके बजाय, View फ़ील्ड जनरेट करता है. इसके लिए, बाद में binding.userBio as TextView.

इस सीमा के आस-पास काम करने के लिए, व्यू बाइंडिंग, tools:viewBindingType के साथ काम करती है एट्रिब्यूट की मदद से, कंपाइलर को यह बताया जा सकता है कि जनरेट किए गए कोड में किस टाइप का इस्तेमाल करना है. ऊपर दिए गए उदाहरण में, कंपाइलर बनाने के लिए इस एट्रिब्यूट का इस्तेमाल किया जा सकता है फ़ील्ड को TextView के तौर पर जनरेट करें:

# in res/layout/example.xml (unchanged)

<TextView android:id="@+id/user_bio" />

# in res/layout-land/example.xml

<EditText android:id="@+id/user_bio" tools:viewBindingType="TextView" />

दूसरे उदाहरण में, मान लें कि आपके पास दो लेआउट हैं, जिनमें से एक में BottomNavigationView और दूसरा, जिसमें NavigationRailView शामिल है. दोनों क्लास में NavigationBarView की वैल्यू बढ़ाई जा सकती है, जिसमें लागू करने का ज़्यादातर हिस्सा शामिल होता है विवरण. अगर आपके कोड को यह जानने की ज़रूरत नहीं है कि किस सब-क्लास में मौजूद है मौजूदा लेआउट है, तो जनरेट किया गया लेआउट सेट करने के लिए, tools:viewBindingType का इस्तेमाल किया जा सकता है दोनों लेआउट में NavigationBarView टाइप करें:

# in res/layout/navigation_example.xml

<BottomNavigationView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />

# in res/layout-w720/navigation_example.xml

<NavigationRailView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />

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

  • वैल्यू ऐसी क्लास होनी चाहिए जो android.view.View से इनहेरिट की गई हो.
  • वैल्यू, उस टैग की सुपर क्लास होनी चाहिए जिस पर इसे डाला गया है. उदाहरण के लिए, यहां दी गई वैल्यू काम नहीं करेंगी:

      <TextView tools:viewBindingType="ImageView" /> <!-- ImageView is not related to TextView. -->
      <TextView tools:viewBindingType="Button" /> <!-- Button is not a superclass of TextView. -->
    
  • फ़ाइनल टाइप, सभी कॉन्फ़िगरेशन में एक जैसा होना चाहिए.

FindViewById से अंतर

findViewById का इस्तेमाल करने के मुकाबले व्यू बाइंडिंग के अहम फ़ायदे हैं:

  • शून्य सुरक्षा: व्यू बाइंडिंग से, व्यू के लिए सीधे रेफ़रंस बनता है, अमान्य व्यू आईडी की वजह से, शून्य पॉइंटर हो जाने का कोई जोखिम नहीं है. इसके अलावा, जब कोई व्यू सिर्फ़ कुछ कॉन्फ़िगरेशन में मौजूद होता है लेआउट, बाइंडिंग क्लास में इसके रेफ़रंस वाली फ़ील्ड को @Nullable के साथ.
  • टाइप सेफ़्टी: हर बाइंडिंग क्लास के फ़ील्ड में टाइप सेफ़्टी होती है देखते हैं, जिनका संदर्भ वे एक्सएमएल फ़ाइल में देते हैं. इसका मतलब है कि इसमें क्लास का कोई जोखिम नहीं है कास्ट अपवाद.

इन अंतरों का मतलब है कि आपके लेआउट और कोड के साथ काम नहीं करता इसकी वजह से, आपका बिल्ड रनटाइम के बजाय कंपाइल समय पर काम करना बंद कर सकता है.

डेटा बाइंडिंग से तुलना

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

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

वहीं दूसरी ओर, डेटा की तुलना में व्यू बाइंडिंग की सीमाएं बाइंडिंग:

इन बातों की वजह से, कुछ मामलों में दोनों व्यू का इस्तेमाल करना सबसे बेहतर होता है बाइंडिंग और डेटा बाइंडिंग का काम करता है. ऐसे लेआउट में डेटा बाइंडिंग का इस्तेमाल किया जा सकता है ऐडवांस सुविधाओं की ज़रूरत होती है और लेआउट में व्यू बाइंडिंग का इस्तेमाल करना होता है.

अन्य संसाधन

व्यू बाइंडिंग के बारे में ज़्यादा जानने के लिए, नीचे दिए गए अन्य संसाधन देखें:

सैंपल

ब्लॉग

वीडियो