जैसा कि अन्य लोगों ने उल्लेख किया है, 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और में इसे पारित आप डि, या एकमात्र उपयोग कर सकते हैं, या पैदा करते हैं। ContextInitialising से पहले निर्भर घटक सही ViewModelमें Fragment/ Activity।
क्यों परेशान करें: Contextएक एंड्रॉइड-विशिष्ट चीज है, और उन पर निर्भर करता ViewModelहै एक बुरा अभ्यास है: वे इकाई परीक्षण के रास्ते में खड़े हैं। दूसरी ओर, आपके स्वयं के घटक / सेवा इंटरफेस पूरी तरह से आपके नियंत्रण में हैं, ताकि आप उन्हें आसानी से परीक्षण के लिए मॉक कर सकें।
AndroidViewModelलेकिनCannot create instance exceptionतब आप मेरे इस जवाब का उल्लेख कर सकते हैं stackoverflow.com/a/62626408/1055241