2016-01-11 7 views
9

क्या डेटाबंडिंग के साथ viewStubs का उपयोग करने के लिए वैसे भी है? ViewStubProxy मदद कर सकते हैं?एंड्रॉइड डेटा बाध्यकारी - डेटा बाइंडिंग के साथ व्यूस्ट्यूब का उपयोग कैसे करें

मेरे ठूंठ वर्तमान इस तरह दिखता है:

<ViewStub 
    android:id="@+id/stub_import" 
    android:inflatedId="@+id/panel_import" 

    android:layout="@layout/progress_overlay" 

    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="@{myobject.bottom ? bottom:top}" /> 

लेकिन इस लेआउट बदल दिया जाएगा जब मैं viewStub बढ़ तो कैसे ViewStubs एंड्रॉयड databinding के साथ प्रयोग किया जा सकता है?

इस मैं क्या docs से देख रहा है:

ViewStubs

ViewStubs सामान्य दृश्य से थोड़ी अलग हैं। वे अदृश्य हो जाते हैं और जब वे या तो दिखाई देते हैं या स्पष्ट रूप से को फुलाए जाने के लिए स्पष्ट रूप से बताया जाता है, तो वे खुद को लेआउट को बढ़ाकर लेआउट में बदल देते हैं।

क्योंकि व्यूस्ट्यूब दृश्य दृश्य पदानुक्रम से अनिवार्य रूप से गायब हो जाता है, बाइंडिंग ऑब्जेक्ट में दृश्य संग्रह को अनुमति देने के लिए भी गायब होना चाहिए। चूंकि दृश्य अंतिम हैं, ViewStubProxy ऑब्जेक्ट व्यूस्ट्यूब की जगह लेता है, जो डेवलपर को व्यूस्ट्यूब पर मौजूद होने पर पहुंच प्रदान करता है और व्यूस्ट्यूब फुलाए जाने पर फुलाए गए दृश्य पदानुक्रम तक पहुंच प्रदान करता है।

एक और लेआउट फुलाते समय, नए लेआउट के लिए बाध्यकारी स्थापित किया जाना चाहिए। इसलिए, ViewStubProxy को ViewStub के ViewStub.OnInflateListener को सुनना चाहिए और उस समय बाध्यकारी स्थापित करना होगा। चूंकि केवल एक ही अस्तित्व में है, ViewStubProxy डेवलपर को पर ऑनइनफ्लैट लिस्टर सेट करने की अनुमति देता है कि यह बाध्यकारी स्थापित करने के बाद कॉल करेगा।

उत्तर

11

बस श्रोता सेट के रूप में दस्तावेज़ का कहना है:

mBinding.viewStub.setOnInflateListener(new ViewStub.OnInflateListener() { 
    @Override 
    public void onInflate(ViewStub stub, View inflated) { 
     ViewStubBinding binding = DataBindingUtil.bind(inflated); 
     binding.setModel(model); 
    } 
}); 



public void inflateViewStub(View view) { 
    if (!mBinding.viewStub.isInflated()) { 
     mBinding.viewStub.getViewStub().inflate(); 
    } 
} 
+1

एक नोट, 'ViewStubBinding के रूप में 'कक्षा नहीं है, यह दृश्य स्टब के लिए बाध्यकारी वर्ग है। इसे समझने में मुझे थोड़ी देर लग गई; उम्मीद है कि यह टिप्पणी किसी और की मदद करेगी। – BlackHatSamurai

0

viewStub

mBinding.viewStub.setOnInflateListener(new OnInflateListener() { 
    @Override 
    public void onInflate(ViewStub stub, View inflated) { 
    ViewStubBinding binding = DataBindingUtil.bind(inflated); //call after succesful inflating of viewStub 
    // set data here 
    } 
}); 

के सफल चढ़ा के बाद फुलाया लेआउट तक पहुँच प्राप्त करने श्रोता सेट फिर अपने viewStub

बढ़
mBinding.viewStub.getViewStub().inflate(); 
0

अपने एक्सएमएल नेमस्पेस घोषित करें, और उसके माध्यम से चर पारित करें। यह <include> के साथ भी काम करता है, बीटीडब्ल्यू। यहाँ एक उदाहरण है:

main_layout.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:my-namespace="http://schemas.android.com/apk/res-auto"> 
    <data> 
     <variable name="myData" type="com.example.SomeModel" /> 
    </data> 

    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

     <ViewStub 
      android:id="@+id/view_stub" 
      android:inflatedId="@+id/view" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout="@layout/another_layout" 
      my-namespace:data="@{myData}" 
      /> 

    </RelativeLayout> 
</layout> 

another_layout.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
<!-- No need to declare my-namespace here --> 
    <data> 
     <variable name="data" type="com.example.SomeModel" /> 
    </data> 

    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@{data.someValue}" /> 

    </RelativeLayout> 
</layout> 

तो अब तुम सिर्फ inflate() कॉल करनी होगी और लेआउट डेटा होगा। आप इसे सत्यापित करने के लिए जेनरेट बाध्यकारी वर्ग की जांच कर सकते हैं। इसमें टाइप सुरक्षा भी है, इसलिए आप किसी अन्य प्रकार को data में पास नहीं कर सकते हैं।

0

मुझे इस प्रकार के मुद्दों का भी सामना करना पड़ा, अंत में मुझे एक समाधान मिला और यह पूरी तरह से काम कर रहा है।

ViewStub होल्डिंग लेआउट ,,

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 

    <data class="MBinding"> 

     <variable 
      name="mmmmm" 
      type="com.vvv.bbb.fragments.MFragment" /> 

    </data> 
    -------------------- 
    -------------------- 
    <ViewStub 
    android:id="@+id/stub_import" 
    ------------------- 
    ------------------- 
     <ViewStub/> 
    -------------------- 
    -------------------- 
<layout/> 

ViewStub अंदर लेआउट ,,, है

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto"> 

    <data class="MViewStubLayoutBinding"> 

     <variable 
      name="mmmmm" 
      type="com.vvv.bbb.fragments.MFragment" /> 

    </data> 
    ---------------- 
    ---------------- 
    ---------------- 

कोड कक्षा के अंदर है ,,,

public Class KKKKKK() { 
----------------- 
MBinding mBinding; 
MViewStubLayoutBinding mviewStubLayoutBinding; 

----------------------------- 
----------------------------- 

mBinding.stubImport.getViewStub().setLayoutResource(R.layout.progress_overlay); 

    mBinding.stubImport.setOnInflateListener(new ViewStub.OnInflateListener() { 
      @Override 
      public void onInflate(ViewStub viewStub, View view) { 
       mviewStubLayoutBinding=DataBindingUtil.bind(view); 
      } 
     }); 

     autoCheckBinding.vsAutoDetailsOne.getViewStub().inflate(); 
संबंधित मुद्दे