2015-08-28 7 views
16

मुझे पता है कि यह उनके संसाधन आईडी से लेआउट में संसाधनों के संदर्भ के लिए संभव है:डेटा बाइंडिंग: गतिशील आईडी द्वारा संसाधन कैसे प्राप्त करें?

android:text="@{@string/resourceName}" 

हालांकि, मैं आईडी जो केवल कार्यावधि में जाना जाता है के द्वारा संसाधन संदर्भ के लिए करना चाहते हैं। एक साधारण उदाहरण के रूप में, कल्पना करें कि हमारे पास ऐसा मॉडल है:

public class MyPOJO { 

    public final int resourceId = R.string.helloWorld; 

} 

और अब मुझे इस मान को प्रारूप स्ट्रिंग में मान के रूप में उपयोग करने की आवश्यकता है। इसे कहते हैं

<string name"myFormatString">Value is: %s</string> 

सबसे स्पष्ट दृष्टिकोण काम नहीं करता:

android:text="@{@string/myFormatString(myPojo.resourceId)} 

प्लेसहोल्डर में यह सिर्फ डाल देंगे पूर्णांक मान (यह भी साबित होता है कि मैं अपने POJO सही तरीके से प्रारंभ, तो मैं प्रदान नहीं कर रहा हूँ यहां पूरा लेआउट)।

मैं भी @BindingConversion उपयोग करने की कोशिश की, लेकिन यह काम नहीं किया था (जो वास्तव में की उम्मीद है, लेकिन मैं वैसे भी करने की कोशिश की) - int अभी भी प्लेसहोल्डर को सौंपा गया था और बाध्यकारी विधि आमंत्रित नहीं किया गया।

मैं डेटाबाइंडिंग लाइब्रेरी में अपनी आईडी द्वारा संसाधन को स्पष्ट रूप से कैसे प्राप्त कर सकता हूं?

public class BindingUtils { 

    public static String string(int resourceId) { 
     return MyApplication 
       .getApplication() 
       .getResources() 
       .getString(resourceId); 
    } 

} 

इसके लिए एक आयात की घोषणा:

उत्तर

7

मैं अपने ही विधि बना दी दौरान

<data> 

    <import type="com.example.BindingUtils" /> 

    ... 

</data> 

और बस यह बुला बाध्यकारी:

android:text="@{@string/myFormatString(BindingUtils.string(myPojo.resourceId))}" 

लिए अच्छा नहीं होगा इसके लिए आउट-ऑफ-द-बॉक्स विधि है। डाटाबाइंडिंग बीटा में साइटल है - तो शायद यह भविष्य में आएगा।

11

एक और समाधान इसके लिए कस्टम @BindingAdapter बनाना है।

@BindingAdapter({"format", "argId"}) 
public static void setFormattedText(TextView textView, String format, int argId){ 
    if(argId == 0) return; 
    textView.setText(String.format(format, textView.getResources().getString(argId))); 
} 

और फिर केवल अलग-अलग चर उपलब्ध कराएं।

<TextView 
    app:format="@{@string/myFormatString}" 
    app:argId="@{myPojo.resourceId}" 

यदि आपको कई तर्कों की आवश्यकता है तो आप एक सरणी का उपयोग कर सकते हैं, लेकिन मेरे मामले में, एक पर्याप्त था।

9

जून 2016 के रूप में इस एक्सएमएल में संभव है:

android:text= "@{String.format(@string/my_format_string, myPojo.resourceId)}" 
+0

मैं तो बस इस बात की पुष्टि करने के लिए कोई रास्ता नहीं यह अभी कोशिश करने के लिए है, - से जोड़ दिया जाएगा दिए गए संसाधन आईडी या आईडी को 'int' के रूप में स्वयं के लिए स्ट्रिंग? –

+0

यह संसाधन आईडी देता है – Robust

0

आप उपयोग कर सकते हैं:

android:text='@{(id > 0) ? context.getString(id) : ""}' 
संबंधित मुद्दे