2016-04-04 10 views
9

के साथ गतिशील रूप से लेआउट शामिल है I डेटा-बाइंडिंग लाइब्रेरी के साथ एंड्रॉइड एप्लिकेशन के लिए एमवीवीएम फ्रेमवर्क का उपयोग कर रहा हूं।एंड्रॉइड डेटा-बाइंडिंग लाइब्रेरी

मेरे पास कुछ पुन: प्रयोज्य घटक हैं, जिनमें प्रत्येक गतिविधि होनी चाहिए। उदा टूलबार, मेनू, फ़्लोटिंग एक्शन बटन।

मैं एक सामान्य गतिविधि बनाना चाहता हूं, जो इन सभी पुन: प्रयोज्य सुविधाओं को लागू करेगा और फिर प्रत्येक गतिविधि वर्ग को इस सामान्य गतिविधि से विरासत में प्राप्त किया जाएगा। मेरे पास जेनेरिक व्यू मॉडेल क्लास भी है और हर दूसरे व्यू मॉडेल को इस सामान्य वर्ग से विरासत में मिला है।

लेकिन मुझे लेआउट के साथ समस्या है। मैं जेनेरिक लेआउट फ़ाइल बनाना चाहता हूं और इसमें डायनामिक रूप से sublayout शामिल करना चाहते हैं। उदा

<?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" 
    xmlns:tools="http://schemas.android.com/tools"> 

    <data> 

     <variable 
      name="data" 
      type="com.mypackage.genericViewModel" /> 
    </data> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <include 
      bind:data="@{data}" 
      layout="@layout/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 

     <include 
      layout="@{Here i want to have dynamic variable}" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 
    </LinearLayout></layout> 

मैं प्रत्येक गतिविधि के लिए कॉपी करने के लिए/इस कोड को पेस्ट नहीं करना चाहते, लेकिन डेटा-बाइंडिंग पुस्तकालय लेआउट गतिशील शामिल करने के लिए अनुमति नहीं है। क्या ऐसे मामलों के लिए कोई समाधान है?

उत्तर

0

यहां मेरा समाधान है, उम्मीद है कि यह आपकी मदद करेगा, मुझे नहीं लगता कि यह एक अच्छा तरीका है। अगर आपको बेहतर तरीका मिल जाए, तो कृपया मुझे बताएं। धन्यवाद!

हालांकि डेटा-बाइंडिंग पुस्तकालय लेआउट गतिशील शामिल करने के लिए अनुमति नहीं है, हम विभिन्न लेआउट मैं एक कंटेनर के रूप में एक LinearLayout इस्तेमाल किया गतिशील लेआउट की मेजबानी के लिए के लिए अलग ViewModel उपयोग कर सकते हैं, तो अपने कंटेनर के लिए दृश्य जोड़ने के लिए गतिविधि setContentView विधि ओवरराइड (LinearLayout)।

GenericActivity

protected GenericViewBinding mBinding; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);   
     mBinding = DataBindingUtil.setContentView(this, R.layout.generic_view);   
} 

    @Override 
    public void setContentView(View view) { 
     LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
     mBinding.container.addView(view,lp); 
} 

generic_view लेआउट

<data> 
     <variable 
      name="genericViewModel" 
      type=".viewModel.GenericViewModel"/> 
    </data> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@android:color/white"> 
     <!--a custom view,some generic layout --> 
     <.view.base.BaseTitleView 
      android:id="@+id/base_title" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"/> 
     <LinearLayout 
      android:id="@+id/container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_below="@id/base_title" 
      android:orientation="vertical"> 
     </LinearLayout> 
    </RelativeLayout> 

ठोस गतिविधि में आप इस तरह इसका इस्तेमाल:

ConcreteActivity

//different layout use different ViewModel here,generic logic&layout is in GenericActivity&generic_view layout. 
private ActivityConcreteBinding mActivityConcreteBinding; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mActivityConcreteBinding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.activity_concrete,null,false); 
    setContentView(mActivityConcreteBinding.getRoot()); 
    ConcreteViewModel concreteViewModel = new ConcreteViewModel(mBinding);//mBinding from GenericActivity, deliver it into ConcreteViewModel to do some generic logic. 
    ... 
} 

मेरे लिए, हर गतिविधि के लिए पेस्ट जेनेरिक लेआउट को कॉपी करने की आवश्यकता नहीं है।

+0

धन्यवाद, यह मेरे लिए उपयोगी था –

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