2015-07-11 6 views
9

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

<data> 
    <variable 
    name="foo" 
    type="com.example.Foo" /> 
</data> 

तो मैं (जो एक पूर्णांक है) एक TextField में चर foo.bar को देखें, यह उम्मीद के रूप में काम करता है:: मैं इस डेटा तत्व है

<TextView 
    android:text="@{String.valueOf(foo.bar)}" 
    [...] 

मैं था करने की कोशिश की क्या यह:

<SeekBar 
    android:progress="@{foo.bar}" 
    [...] 

लेकिन यह पहचाना नहीं गया था। (जैसे ही मैंने उद्धरणों के बीच "@" लिखा था, यह संपादक में लाल हो गया)। डेटा का बाध्यकारी करने का कोई और तरीका है?

+1

फोन करके हम्म यह काम करना चाहिए। यह एक आईडीई हाइलाइट बग हो सकता है। क्या आपने संकलन करने की कोशिश की? – yigit

+0

मैंने आज सीखा, कि मुझे हमेशा संकलन करने की कोशिश करनी चाहिए :) यह काम करता है! धन्यवाद, यज्ञ! – prograde

+0

लेकिन, हम्म, यह foo.getBar() विधि को सही स्थिति में सेट करने के लिए कॉल करता है। लेकिन यह foo.setBar() विधि को कभी भी कॉल नहीं करता है, इसलिए मेरे कोड में मान कभी अपडेट नहीं होता है। क्या इसे अभी भी SeekBarChangeListener की आवश्यकता है, या क्या? – prograde

उत्तर

2

@ जॉर्ज माउंट सही है, आपको अपने लेआउट एक्सएमएल में एक हैंडलर जोड़ना होगा जो आपके मॉडल या हैंडलर क्लास (जिसे आप इसे कहते हैं) में परिभाषित किया गया है। एक पूर्ण विकसित उदाहरण के लिए इस प्रश्न के लिए मेरा उत्तर में

देखो:

उदाहरण::

public class AmanteEditModel extends BaseObservable { 

    private String senhaConfirm; 

    @Bindable 
    public String getSenhaConfirm() { 
     return senhaConfirm; 
    } 

    public void setSenhaConfirm(String senhaConfirm) { 
     this.senhaConfirm = senhaConfirm; 
     notifyPropertyChanged(BR.senhaConfirm); 
    } 

    // Textwatcher Reference: http://developer.android.com/reference/android/text/TextWatcher.html 
    public TextWatcher getMyEditTextWatcher() { 
     return new TextWatcher() { 

      public void afterTextChanged(Editable s) { 
      } 

      public void beforeTextChanged(CharSequence s, int start, 
              int count, int after) { 
      } 

      public void onTextChanged(CharSequence s, int start, 
            int before, int count) { 
       // Important! Use the property setter, otherwhise the model won't be informed about the change. 
       setSenhaConfirm(s); 
      } 
     }; 
    } 

} 

अपने लेआउट एक्सएमएल में

Two way databinding with Android Databinding Library

यहाँ है कि इसका जवाब से उदाहरण दिया गया है इस पर EditText बदलें:

<EditText 
    android:id="@+id/amante_edit_senha_confirm" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical" 
    android:hint="Confirme a senha" 
    android:inputType="textPassword" 
    android:maxLines="1" 
    android:text="@{model.senhaConfirm}" 
    app:addTextChangeListener="@{model.myEditTextWatcher}" 
    /> 

के नामस्थान के लिए देखें addTextChangeListener। यह विधि एंड्रॉइड के माध्यम से उपलब्ध नहीं हो सकती है: नेमस्पेस, इसलिए मैं ऐप का उपयोग कर रहा हूं: यहां। आप बाइंडिंग का उपयोग भी कर सकते हैं: बाइंडिंग को और स्पष्ट करने के लिए।

तो अपने एक्सएमएल नामस्थान को

xmlns:app="http://schemas.android.com/apk/res-auto" 

या

xmlns:bind="http://schemas.android.com/apk/res-auto" 

जोड़ने के लिए मौका न चूकें।

यह समाधान आपके इनपुट में सही श्रोताओं को प्रदान करने के बाद, सभी इनपुट नियंत्रणों, कस्टम शामिल करने के लिए काम करता है।

TextWatcher Reference

8

जब seekbar परिवर्तन, बाँध android:onProgressChanged विशेषता के माध्यम से परिवर्तन प्रगति के लिए अद्यतन करने के लिए TextView प्राप्त करने के लिए। यह SeekBarBindingAdapter.OnProgressChanged के हस्ताक्षर के साथ मॉडल में एक सार्वजनिक विधि की उम्मीद:

देखें

<TextView 
    android:text="{@model.seekBarValue} /> 

<SeekBar 
    android:onProgressChanged="@{model.onValueChanged}" /> 

मॉडल

public class Model { 
    public ObservableField<String> seekBarValue = new ObservableField<>(""); 

    public void onValueChanged(SeekBar seekBar, int progresValue, boolean fromUser) { 
     seekBarValue.set(progresValue + ""); 
    } 
} 

सामान्य मैं सलाह आप के लिए स्रोत कोड को देखने के लिए में डेटा बाध्यकारी के लिए बनाए गए सभी एडाप्टर वर्ग।यदि आप उदाहरण के लिए एंड्रॉइड स्टूडियो (मेनू नेविगेट> फ़ाइल) में फ़ाइल SeekBarBindingAdapter.java पर नेविगेट करते हैं तो आप उन सभी ईवेंट विधियों को सीखेंगे जिन्हें आप एडाप्टर के माध्यम से जोड़ सकते हैं।

@BindingAdapter("android:onProgressChanged") 
public static void setListener(SeekBar view, OnProgressChanged listener) { 
    setListener(view, null, null, listener); 
} 
3

मामले में यह किसी को मदद करता है, इस सवाल का एक बहुत कुछ है, यह अब दो तरह से डेटा बाइंडिंग का उपयोग कर किया जा सकता है खोज के तहत आता है: क्योंकि गूगल निम्नलिखित अनुकूलक को लागू किया है यह विशेष सुविधा उपलब्ध है। मैं नीचे दो बाइंडेबल मानों का उपयोग करता हूं, मुझे एक्सएमएल में कोई डिस्प्ले लॉजिक पसंद नहीं है, लेकिन मुझे संदेह है कि यह सिर्फ एक के साथ भी काम कर सकता है।

अपने ViewModel, SeekBar (seekValue) के लिए और एक TextView (seekDisplay)

int mSeekValue; 
int mSeekDisplay; 

@Bindable 
public int getSeekValue() { 
    return mSeekValue; 
} 

public void setSeekValue(int progress) { 
    mSeekValue = progress; 
    notifyPropertyChanged(BR.seekValue); 
    setSeekDisplay(progress); 
} 

@Bindable 
public String getSeekDisplay() { 
    return Integer.toString(mSeekDisplay); 
} 

public void setSeekDisplay(int progress) { 
    mSeekDisplay = progress; 
    notifyPropertyChanged(BR.seekDisplay); 
} 

अब आप Widget रों करने के लिए इन बाध्य कर सकते हैं के लिए में bindable मूल्यों बनाएँ।

<SeekBar 
    android:id="@+id/my_seek" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:progress="@={viewModel.seekValue}" /> 
<TextView 
    android:id="@+id/my_text" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="@{viewModel.seekDisplay}" /> 

मुख्य बिंदु ध्यान दें कि आप दो तरह @={viewModel.seekValue}, जो आपके setSeekValue(...) विधि कॉल करेंगे का उपयोग कर SeekBar पर databinding का उपयोग कर रहे है।

एक यह कहा जाता है, यह अद्यतन करेगा आपके TextViewsetSeekDisplay(...)

+0

+1। आप टेक्स्टव्यू पर एक ही प्रॉपर्टी तलाश वैल्यू और @ {Integer.toString (viewModel.seekValue)} का उपयोग कर भी प्राप्त कर सकते हैं। – josmith42

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