2016-01-18 5 views
6

में डेटा बाइंडिंग का उपयोग करके लेआउट_विड्थ और लेआउट_हेइट को कैसे बांधें, मैं एक बूलियन बांधने की कोशिश कर रहा हूं जो स्क्रीन आकार छोटा होने पर इमेज व्यू को इंगित करता है, इसलिए अगर मुझे अन्य घटकों के लिए और अधिक जगह चाहिए तो यह घटता है। मैं ऐसा करने के लिए DataBinding Library का उपयोग कर रहा हूं।एंड्रॉइड

मेरे लेआउट जिसका चौड़ाई और ऊंचाई इस बूलियन पर निर्भर करता है:

... 
<data> 
    ... 
    <variable name="smallScreen" type="boolean"/> 
    ... 
</data> 
... 
<ImageView 
android:layout_width="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}" 
android:layout_height="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}" 
android:layout_gravity="center_horizontal" 
android:contentDescription="@{message}" 
android:src="@{image}" 
android:scaleType="center" 
tools:src="@drawable/img_message_private"/> 
... 

अगर मैं सिर्फ इस तरह अपने प्रोजेक्ट बनाने की कोशिश, संकलक का कहना है layout_width प्रकार नाव स्वीकार नहीं कर सकते। पर्याप्त मेला, मैं इस प्रकार है, बनाने के लिए एक नाव लेआउट विशेषताओं के लिए प्रवेश BindingAdapter वर्ग का उपयोग करें:

... 
@BindingAdapter("android:layout_width") 
public static void setLayoutWidth(View view, float width) { 
    ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); 
    layoutParams.width = (int) width; 
    view.setLayoutParams(layoutParams); 
} 

@BindingAdapter("android:layout_height") 
public static void setLayoutHeight(View view, float height) { 
    ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); 
    layoutParams.height = (int) height; 
    view.setLayoutParams(layoutParams); 
} 
... 

अपने प्रोजेक्ट बनाने की अनुमति देता है। लेकिन जब लेआउट अंत में गाया जा रहा है, मैं निम्न अपवाद में गिरावट:

java.lang.RuntimeException: Binary XML file line #21: You must supply a layout_width attribute. 

बस जानकारी के लिए, मेरे आयाम, डी पी इकाइयों में स्थापित कर रहे हैं इस प्रकार है:

<dimen name="img_small_screen_size">100dp</dimen> 
<dimen name="img_big_screen_size">208dp</dimen> 

कोई जानता है कि कैसे कर सकते हैं मैं layout_width विशेषता को ओवरराइड करता हूं ताकि मैं आयामों का उपयोग करके सीधे इसके साथ डेटाबेस का उपयोग कर सकूं?

उत्तर

5

मैंने अभी यह पता लगाया क्योंकि मैंने अपना प्रश्न लिखा था। मैं तो बस एक मैं बदल चाहते थे बाध्य करने के लिए एक और विशेषता का इस्तेमाल किया, कोड इस तरह समाप्त हो गया:

<ImageView 
android:layout_width="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}" 
android:layout_height="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size}" 
android:layout_gravity="center_horizontal" 
android:contentDescription="@{message}" 
android:src="@{image}" 
android:scaleType="center" 
tools:src="@drawable/img_message_private"/> 

तो मेरी BindingAdapters इस बने:

@BindingAdapter("android:layout_width") 
public static void setLayoutWidth(View view, float width) { 
    ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); 
    layoutParams.width = (int) width; 
    view.setLayoutParams(layoutParams); 
} 

@BindingAdapter("android:layout_height") 
public static void setLayoutHeight(View view, float height) { 
    ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); 
    layoutParams.height = (int) height; 
    view.setLayoutParams(layoutParams); 
} 
+2

आप "एंड्रॉइड: लेआउट_विड्थ" का भी उपयोग कर सकते हैं। आपको अपना नामस्थान उपयोग करने की ज़रूरत नहीं है। –

+0

यह सच है, अभी मेरा जवाब संपादित किया गया है –

+2

अब आपका उत्तर प्रश्न – Bolein95

2

आप एक डिफ़ॉल्ट मान जोड़ना चाहिए, यानी,

android:layout_width="@{smallScreen ? @dimen/img_small_screen_size : @dimen/img_big_screen_size, default=wrap_content}" 
+0

धन्यवाद जैसा दिखता है। डिफ़ॉल्ट मान सेटिंग मेरी समस्या हल करती है। लेकिन मुझे एक संदेह है, डिफ़ॉल्ट मान कभी निष्पादित नहीं होगा, या तो पहला या दूसरा मान चल जाएगा तो डिफ़ॉल्ट मान क्यों? – Shubham

+0

धन्यवाद! आपकी पोस्ट ने भी मेरी मदद की है! – Sam