जैसा कि अन्य लोगों ने उल्लेख किया है, AndroidViewModel
कि आप एप्लिकेशन प्राप्त करने के लिए किस से प्राप्त कर सकते हैं, Context
लेकिन जो मैं टिप्पणियों में इकट्ठा करता हूं, आप @drawable
अपने भीतर से हेरफेर करने की कोशिश कर रहे हैं, ViewModel
जो उद्देश्य एमवीवीएम को हराता है।
सामान्य तौर पर, Context
आपके ViewModel
लगभग सार्वभौमिक रूप से एक होने की आवश्यकता का सुझाव आपको पुनर्विचार पर विचार करना चाहिए कि आप अपने View
और अपने बीच के तर्क को कैसे विभाजित करते हैंViewModels
।
ViewModel
समाधानों को हल करने और गतिविधि / टुकड़े करने के लिए उन्हें खिलाने के बजाय , Fragment / गतिविधि के पास मौजूद डेटा पर आधारित ड्राफ़्ट को हथकंडा करने पर विचार करें ViewModel
। कहो, आपको राज्य के लिए / बंद दृश्य में प्रदर्शित करने के लिए अलग-अलग दराज की आवश्यकता है - यह वह है ViewModel
जो (शायद बूलियन) राज्य को पकड़ना चाहिए, लेकिन यह हैView
ड्रॉबल का चयन करने के लिए उसके अनुसार व्यवसाय है।
यह DataBinding के साथ काफी आसान किया जा सकता है :
<ImageView
...
app:src="@{viewModel.isOn ? @drawable/switch_on : @drawable/switch_off}"
/>
यदि आपके पास अधिक राज्य और ड्रॉबल्स हैं, तो लेआउट फ़ाइल में अनिर्दिष्ट तर्क से बचने के लिए आप एक कस्टम बाइंडिंग एडाप्टर लिख सकते हैं जो अनुवाद करता है, कहता है, Enum
मानR.drawable.*
(जैसे कार्ड सूट)
या हो सकता है आप की जरूरत Context
कुछ घटक है कि आप के भीतर उपयोग के लिए अपने ViewModel
- तो, बाहर घटक बनाने ViewModel
और में इसे पारित आप डि, या एकमात्र उपयोग कर सकते हैं, या पैदा करते हैं। Context
Initialising से पहले निर्भर घटक सही ViewModel
में Fragment
/ Activity
।
क्यों परेशान करें: Context
एक एंड्रॉइड-विशिष्ट चीज है, और उन पर निर्भर करता ViewModel
है एक बुरा अभ्यास है: वे इकाई परीक्षण के रास्ते में खड़े हैं। दूसरी ओर, आपके स्वयं के घटक / सेवा इंटरफेस पूरी तरह से आपके नियंत्रण में हैं, ताकि आप उन्हें आसानी से परीक्षण के लिए मॉक कर सकें।
AndroidViewModel
लेकिनCannot create instance exception
तब आप मेरे इस जवाब का उल्लेख कर सकते हैं stackoverflow.com/a/62626408/1055241