खोज…


टिप्पणियों

सेट अप

डेटा बाइंडिंग का उपयोग करने से पहले, आपको अपने build.gradle में प्लगइन को सक्षम करना होगा।

android {
    ....
    dataBinding {
        enabled = true
    }
}

नोट: संस्करण 1.5.0 में एंड्रॉइड ग्रैगल प्लगइन में डेटा बाइंडिंग जोड़ा गया था

बाइंडिंग क्लास के नाम

डेटा बाइंडिंग प्लगइन आपके लेआउट के फ़ाइल नाम को पास्कल केस में परिवर्तित करके और अंत में "बाइंडिंग" जोड़कर एक बाइंडिंग क्लास नाम उत्पन्न करता है। इस प्रकार item_detail_activity.xml एक वर्ग नामित उत्पन्न होगा ItemDetailActivityBinding

साधन

मूल पाठ क्षेत्र बाइंडिंग

ग्रेड (मॉड्यूल: ऐप) कॉन्फ़िगरेशन

android {
    ....
    dataBinding {
        enabled = true
    }
}

डेटा मॉडल

public class Item {
    public String name;
    public String description;

    public Item(String name, String description) {
        this.name = name;
        this.description = description;
    }
}

लेआउट XML

पहला चरण <layout> टैग में आपके लेआउट को लपेट रहा है, एक <data> तत्व जोड़ रहा है, और अपने डेटा मॉडल के लिए एक <variable> तत्व जोड़ रहा है।

फिर आप @{model.fieldname} का उपयोग करके डेटा मॉडल में फ़ील्ड में XML विशेषताओं को बाँध सकते हैं, जहाँ model चर का नाम है और fieldname वह फ़ील्ड है जिसे आप एक्सेस करना चाहते हैं।

item_detail_activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="item" type="com.example.Item"/>
   </data>

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

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

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

   </LinearLayout>
</layout>

प्रत्येक XML लेआउट फ़ाइल को बाइंडिंग के साथ ठीक से कॉन्फ़िगर करने के लिए, एंड्रॉइड ग्रैडल प्लगइन एक संबंधित वर्ग उत्पन्न करता है: बाइंडिंग। क्योंकि हमारे पास item_detail_activity नाम का एक लेआउट है, इसलिए संबंधित उत्पन्न बाध्यकारी वर्ग को ItemDetailActivityBinding कहा जाता है।

इस बंधन का उपयोग इस तरह की गतिविधि में किया जा सकता है:

public class ItemDetailActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       ItemDetailActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.item_detail_activity);
       Item item = new Item("Example item", "This is an example item.");
       binding.setItem(item);
    }
}

एक सहायक विधि के साथ बाइंडिंग

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

डेटा मॉडल

public class Item {
    private String name;

    public String getName() {
        return name;
    }
}

लेआउट XML

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="item" type="com.example.Item"/>
   </data>

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

       <!-- Since the "name" field is private on our data model,
            this binding will utilize the public getName() method instead. -->
       <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{item.name}"/>

   </LinearLayout>
</layout>

रेफरेंसिंग क्लासेस

डेटा मॉडल

public class Item {
    private String name;

    public String getName() {
        return name;
    }
}

लेआउट XML

जैसा कि आप जावा में करते हैं, आपको संदर्भित कक्षाओं को आयात करना होगा।

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <import type="android.view.View"/>
       <variable name="item" type="com.example.Item"/>
   </data>

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

       <!-- We reference the View class to set the visibility of this TextView -->
       <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{item.name}"
           android:visibility="@{item.name == null ? View.VISIBLE : View.GONE"/>

   </LinearLayout>
</layout>

नोट: पैकेज java.lang.* सिस्टम द्वारा स्वचालित रूप से आयात किया जाता है। (यह Java लिए JVM द्वारा बनाया गया है)

फ्रेगमेंट में डाटाइबिंग

डेटा मॉडल

public class Item {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name){
        this.name = name;
    }

}

लेआउट XML

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="item" type="com.example.Item"/>
   </data>

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

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

   </LinearLayout>
</layout>

टुकड़ा

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    FragmentTest binding = DataBindingUtil.inflate(inflater, R.layout.fragment_test, container, false);
    Item item = new Item();
    item.setName("Thomas");
    binding.setItem(item);
    return binding.getRoot();
}

अंतर्निहित दो-तरफ़ा डेटा बाइंडिंग

दो-तरफ़ा डेटा-बाइंडिंग निम्नलिखित विशेषताओं का समर्थन करती है:

तत्त्व गुण
AbsListView android:selectedItemPosition
CalendarView android:date
CompoundButton android:checked
DatePicker
  • android:year
  • android:month
  • android:day
EditText android:text
NumberPicker android:value
RadioGroup android:checkedButton
RatingBar android:rating
SeekBar android:progress
TabHost android:currentTab
TextView android:text
TimePicker
  • android:hour
  • android:minute
ToggleButton android:checked
Switch android:checked

प्रयोग

<layout ...>
    <data>
        <variable type="com.example.myapp.User" name="user"/>
    </data>
    <RelativeLayout ...>
        <EditText android:text="@={user.firstName}" .../>
    </RelativeLayout>
</layout>

ध्यान दें कि बाइंडिंग एक्सप्रेशन @={} में एक अतिरिक्त = , जो टू-वे बाइंडिंग के लिए आवश्यक है। दो-तरफ़ा बाइंडिंग अभिव्यक्तियों में विधियों का उपयोग करना संभव नहीं है।

RecyclerView एडाप्टर में डेटा बाइंडिंग

अपने RecyclerView एडाप्टर के भीतर डेटा बाइंडिंग का उपयोग करना भी संभव है।

डेटा मॉडल

public class Item {
    private String name;

    public String getName() {
        return name;
    }
}

XML लेआउट

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

एडॉप्टर क्लास

public class ListItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Activity host;
    private List<Item> items;

    public ListItemAdapter(Activity activity, List<Item> items) {
        this.host = activity;
        this.items = items;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // inflate layout and retrieve binding
        ListItemBinding binding = DataBindingUtil.inflate(host.getLayoutInflater(),
                R.layout.list_item, parent, false);

        return new ItemViewHolder(binding);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        Item item = items.get(position);

        ItemViewHolder itemViewHolder = (ItemViewHolder)holder;
        itemViewHolder.bindItem(item);
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    private static class ItemViewHolder extends RecyclerView.ViewHolder {
        ListItemBinding binding;

        ItemViewHolder(ListItemBinding binding) {
            super(binding.getRoot());
            this.binding = binding;
        }

        void bindItem(Item item) {
            binding.setItem(item);
            binding.executePendingBindings();
        }
    }
}

श्रोता को बंधन से क्लिक करें

क्लिकहैंडलर के लिए इंटरफ़ेस बनाएँ

public interface ClickHandler {
    public void onButtonClick(View v);
}

लेआउट XML

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

    <data>
        <variable
            name="handler"
            type="com.example.ClickHandler"/>
    </data>

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

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="click me"
            android:onClick="@{handler.onButtonClick}"/>
    </RelativeLayout>
</layout>

अपनी गतिविधि में घटना को संभालें

public class MainActivity extends Activity implements ClickHandler {

    private ActivityMainBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        binding.setHandler(this);
    }

    @Override
    public void onButtonClick(View v) {
        Toast.makeText(context,"Button clicked",Toast.LENGTH_LONG).show();
    }
}

लांबा अभिव्यक्ति का उपयोग करते हुए कस्टम घटना

इंटरफ़ेस परिभाषित करें

public interface ClickHandler {
    public void onButtonClick(User user);
}

मॉडल वर्ग बनाएं

public class User {
    private String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

लेआउट XML

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="handler"
            type="com.example.ClickHandler"/>

        <variable
            name="user"
            type="com.example.User"/>
    </data>

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

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}"
            android:onClick="@{() -> handler.onButtonClick(user)}"/>
    </RelativeLayout>
</layout>

गतिविधि कोड:

public class MainActivity extends Activity implements ClickHandler {

    private ActivityMainBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        binding.setUser(new User("DataBinding User"));
        binding.setHandler(this);
    }

    @Override
    public void onButtonClick(User user) {
        Toast.makeText(MainActivity.this,"Welcome " + user.getName(),Toast.LENGTH_LONG).show();
    }
}

कुछ दृश्य श्रोता के लिए जो xml कोड में उपलब्ध नहीं है, लेकिन जावा कोड में सेट किया जा सकता है, इसे कस्टम बाइंडिंग के साथ बाँधा जा सकता है।

कस्टम वर्ग

public class BindingUtil {
    @BindingAdapter({"bind:autoAdapter"})
    public static void setAdapter(AutoCompleteTextView view, ArrayAdapter<String> pArrayAdapter) {
        view.setAdapter(pArrayAdapter);
    }
    @BindingAdapter({"bind:onKeyListener"})
    public static void setOnKeyListener(AutoCompleteTextView view , View.OnKeyListener pOnKeyListener)
    {
        view.setOnKeyListener(pOnKeyListener);
    }
}

हैंडलर वर्ग

public class Handler extends BaseObservable {
    private ArrayAdapter<String> roleAdapter;
       
    public ArrayAdapter<String> getRoleAdapter() {
        return roleAdapter;
    }
    public void setRoleAdapter(ArrayAdapter<String> pRoleAdapter) {
        roleAdapter = pRoleAdapter;
    }
}

एक्सएमएल

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

    <data>
        <variable
            name="handler"
            type="com.example.Handler" />
    </data>

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

        <AutoCompleteTextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:singleLine="true"
            bind:autoAdapter="@{handler.roleAdapter}" />

    </LinearLayout>
</layout>

डेटा बाइंडिंग में डिफ़ॉल्ट मान

यदि प्रदान किया गया है तो पूर्वावलोकन फलक डेटा बाइंडिंग अभिव्यक्तियों के लिए डिफ़ॉल्ट मान प्रदर्शित करता है।

उदाहरण के लिए :

android:layout_height="@{@dimen/main_layout_height, default=wrap_content}"

यह ले जाएगा wrap_content जबकि डिजाइन और एक रूप में कार्य करेगा wrap_content पूर्वावलोकन फलक में।

एक और उदाहरण है

android:text="@{user.name, default=`Preview Text`}"

यह पूर्वावलोकन फलक में पूर्वावलोकन Preview Text प्रदर्शित करेगा, लेकिन जब आप इसे डिवाइस / एमुलेटर में चलाते हैं तो वास्तविक बाइंड किया हुआ यह प्रदर्शित किया जाएगा

कस्टम चर के साथ डाटाबाइंडिंग (इंट, बूलियन)

कभी-कभी हमें एकल मूल्य के आधार पर छिपाने / दिखाने के दृश्य जैसे बुनियादी संचालन करने की आवश्यकता होती है, उस एकल चर के लिए हम मॉडल नहीं बना सकते हैं या उसके लिए मॉडल बनाना अच्छा अभ्यास नहीं है। DataBinding उन oprations प्रदर्शन करने के लिए बुनियादी डेटाटाइप्स का समर्थन करता है।

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <import type="android.view.View" />

        <variable
            name="selected"
            type="Boolean" />

    </data>

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

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World"
            android:visibility="@{selected ? View.VISIBLE : View.GONE}" />

    </RelativeLayout>
</layout>

और जावा वर्ग से इसका मान निर्धारित किया है।

binding.setSelected(true);

डायलॉग में डेटाबाइंडिंग

public void doSomething() {
    DialogTestBinding binding = DataBindingUtil
            .inflate(LayoutInflater.from(context), R.layout.dialog_test, null, false);

    Dialog dialog = new Dialog(context);
    dialog.setContentView(binding.getRoot());
    dialog.show();
}

विजेट को BindingAdapter के संदर्भ में पास करें

लेआउट XML

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

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

       <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

        <ImageView
        android:id="@+id/img"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        app:imageUrl="@{url}"
        app:progressbar="@{progressBar}"/>

   </LinearLayout>
</layout>

बाइंडिंग एडाप्टर विधि

@BindingAdapter({"imageUrl","progressbar"})
public static void loadImage(ImageView view, String imageUrl, ProgressBar progressBar){
    Glide.with(view.getContext()).load(imageUrl)
                        .listener(new RequestListener<String, GlideDrawable>() {
                    @Override
                    public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                        progressBar.setVisibility(View.GONE);
                        return false;
                    }
                }).into(view);
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow