2016-04-04 5 views
5

मेरे पास 2 लेआउट हैं: एक v19 + और दूसरे संस्करणों के लिए। उनमें अलग-अलग आईडी के साथ अलग-अलग विचार होते हैं। मैं एंड्रॉइड डेटा बाइंडिंग फ्रेमवर्क कैसे कह सकता हूं कि मैं दोनों लेआउट के साथ काम करना चाहता हूं? यह केवल एक लेआउट के लिए दृश्य उत्पन्न करता है (यादृच्छिक रूप से चयन करता है)।कई क्वालीफायरों के साथ लेआउट कैसे बाध्य करें

लेआउट/temp_view.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools"> 

    <data> 

     <variable 
      name="block" 
      type="ru.temp.model.content.blocks.WebMediaBlock" /> 

     <import type="ru.temp.model.Types.ProviderTypes" /> 

    </data> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     tools:background="@android:color/white"> 

     <ImageView 
      android:id="@+id/provider" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:paddingTop="@dimen/size5" 
      android:src="@{ProviderTypes.fromString(block.provider).getResId()}" /> 
    </FrameLayout> 
</layout> 

लेआउट-v19/temp_view.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools"> 

    <data> 

     <variable 
      name="block" 
      type="ru.temp.model.content.blocks.WebMediaBlock" /> 

     <import type="ru.temp.model.Types.ProviderTypes" /> 

    </data> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     tools:background="@android:color/white"> 
     <ru.temp.utils.EmbedView 
      android:id="@+id/media_embed" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 

     <ru.temp.structure.static_material.CreditsView 
      android:id="@+id/credits_view" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
    </FrameLayout> 
</layout> 

अद्यतन:

अंत में मैं बाहर समस्या के मूल पाया है। मुझे नहीं पता कि क्यों, लेकिन यह minSdkVersion 21 का उपयोग करते समय * बाध्यकारी Impl फ़ाइलों को उत्पन्न नहीं करता है। यदि पहले संस्करण निर्दिष्ट करते हैं तो यह कहा जाता है कि यह @yigit

+0

आप अपने संदर्भ के लिए [this] (http://chintanrathod.com/develop_apps_faster_using_data_binding_part2/) ट्यूटोरियल भी देख सकते हैं। –

+0

इसमें समस्या का विवरण शामिल नहीं है – LackOfKnowledge

उत्तर

1

डेटा बाइंडिंग एक बेस क्लास उत्पन्न करेगी जो दोनों के लिए एक सामान्य इंटरफ़ेस के रूप में कार्य करती है (चर)। जब आप DataBindingUtil.setContentView(activity, R.layout.tmp_view पर कॉल करते हैं तो डेटा बाइंडिंग सही उदाहरण बनाने का ख्याल रखेगी)।

उदाहरण के लिए, अपने उदाहरण में, यह

TempViewBinding, TempViewBindingImpl और TempViewBindingV19Impl उत्पन्न होगा। संकलित करने के बाद आप इन कक्षाओं को <app module>/build/intermediates/classes/<your package>/databinding/ के अंदर देख सकते हैं।

TempViewBinding आधार वर्ग है और इसमें प्रत्येक लेआउट के लिए चर और दृश्यों का संयोजन होगा। यदि आप उन्हें आईडीई में नहीं देख रहे हैं, तो एएस में ऑटो-पूर्णता बग हो सकता है (कृपया एक बग फाइल करें)।

+0

दुर्भाग्यवश यह ऐसी आईएमएल कक्षाएं उत्पन्न नहीं करता है। और मुझे आपके द्वारा आधिकारिक दस्तावेज़ों पर दी गई जानकारी नहीं मिल रही है। यह निर्धारित नहीं कर सकता कि मैं गलत क्या कर रहा हूं – LackOfKnowledge

+0

यदि आप नमूना प्रोजेक्ट अपलोड कर सकते हैं, तो मुझे – yigit

+0

देर से प्रतिक्रिया के लिए खेद है, लेकिन समस्या का पता लगाने में काफी समय था। कृपया सिर के अपडेट की जांच करें। और टेस्ट प्रोजेक्ट (मास्टर शाखा) को देखें https://github.com/rchugunov/buzzer वर्तमान संस्करण डेटाबेस में आईएमएल फाइलें उत्पन्न नहीं होती हैं। लेकिन अगर आप build.dadle में minSdkVersion 15 सेट करते हैं तो यह होगा! – LackOfKnowledge

संबंधित मुद्दे