অ্যান্ড্রয়েড ডেটা বাইন্ডিং ব্যবহার করে ট্যাগ অন্তর্ভুক্ত


116

আপডেট নোট:

উপরের উদাহরণটি সঠিকভাবে কাজ করে , কারণ 1.0-আরসি 4 রিলিজ অপ্রয়োজনীয় ভেরিয়েবলের প্রয়োজনটিকে স্থির করে।

মূল প্রশ্ন:

ডকুমেন্টেশনে যেমন বর্ণিত হয়েছে ঠিক তেমনই করি এবং এটি কার্যকর হয় না:

main.xml:

<layout xmlns:andr...
    <data>
    </data>
       <include layout="@layout/buttons"></include>
....

buttons.xml:

<layout xmlns:andr...>
    <data>
    </data>
    <Button
        android:id="@+id/button"
        ...." />

MyActivity.java:

 ... binding = DataBindingUtil.inflate...
binding.button; ->cannot resolve symbol 'button'

কীভাবে বোতাম পাবেন?

উত্তর:


205

সমস্যাটি হ'ল অন্তর্ভুক্ত লেআউটটিকে ডেটা-বাঁধা লেআউট হিসাবে ভাবা হচ্ছে না। একে এক হিসাবে কাজ করার জন্য, আপনাকে একটি ভেরিয়েবল পাস করতে হবে:

buttons.xml:

<layout xmlns:andr...>
  <data>
    <variable name="foo" type="int"/>
  </data>
  <Button
    android:id="@+id/button"
    ...." />

main.xml:

<layout xmlns:andr...
...
   <include layout="@layout/buttons"
            android:id="@+id/buttons"
            app:foo="@{1}"/>
....

তারপরে আপনি বোতাম ক্ষেত্রের মাধ্যমে অপ্রত্যক্ষভাবে বোতামগুলি অ্যাক্সেস করতে পারবেন:

MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.button

1.0-আরসি 4 (সবেমাত্র প্রকাশিত) হিসাবে, আপনার আর ভেরিয়েবলের প্রয়োজন নেই। আপনি এটিকে সহজ করতে পারেন:

buttons.xml:

<layout xmlns:andr...>
  <Button
    android:id="@+id/button"
    ...." />

main.xml:

<layout xmlns:andr...
...
   <include layout="@layout/buttons"
            android:id="@+id/buttons"/>
....

6
1.0-আরসি 4 এখন অপ্রয়োজনীয় ভেরিয়েবলের সমস্যা সমাধান করে। এখন আপনি কেবল ব্যবহার করতে পারেন: <include layout="@layout/buttons" android:id="@+id/buttons"/>। আপনার এখনও আইডি লাগবে যাতে এটি আপনার জন্য একটি সর্বজনীন ক্ষেত্র তৈরি করে যাতে আপনি বাটন ভিউতে অ্যাক্সেস করতে পারেন।
জর্জ মাউন্ট

1
লেআউটটিতে ক্লিক ইভেন্টগুলিকে বাঁধতে অন্য কারও কি সমস্যা হচ্ছে?
নীলজোর

5
সমর্থন সহ অন্তর্ভুক্ত ডেটাবাইন্ডিং। বিকাশকারী.অ্যান্ড্রয়েড
টপিক

1
এখানে মনে রাখার প্রধান বিষয় হ'ল বোতামের রেফারেন্সটি পাওয়া, এর binding.{id of include tag}.buttonপরিবর্তে আপনার প্রয়োজন binding.button। এটি বের করতে আমাকে কিছুক্ষণ সময় লাগল।
isষভ 876

1
@ নিওন ওয়ার্জটি ডেভেলপার.অ্যান্ড্রয়েড / টপিক / লাইব্রিজি / ডেটা-বাইন্ডিং / atএর একটি সম্পূর্ণ উদাহরণ রয়েছে । এটি যোগ করেছে "ডেটা বাঁধাই কোনও মার্জ উপাদানগুলির সরাসরি শিশু হিসাবে অন্তর্ভুক্ত নয়"
ইওয়ান

38

সহজ সম্পূর্ণ উদাহরণ

স্রেফ idঅন্তর্ভুক্ত বিন্যাসে সেট করুন এবং ব্যবহার করুন binding.includedLayout.anyView

এই উদাহরণটি <includeকোডের অন্তর্ভুক্ত ভিউগুলিতে অ্যাক্সেস ও অ্যাক্সেসে সহায়তা করে ।

ধাপ 1

আপনার রয়েছে layout_common.xml, Stringঅন্তর্ভুক্ত লেআউটে পাস করতে চান ।

আপনি Stringবিন্যাসে পরিবর্তনশীল তৈরি করবেন এবং এটিকে উল্লেখ Stringকরুন TextView

<data>
    // declare fields
    <variable
        name="passedText"
        type="String"/>
</data>

<TextView
    android:id="@+id/textView"
    ...
    android:text="@{passedText}"/> //set field to your view.

ধাপ ২

এই লেআউটটিকে প্যারেন্ট লেআউটে অন্তর্ভুক্ত করুন। একটি দিন idঅন্তর্ভুক্ত লেআউটে, আমরা যে ব্যবহার করতে পারেন যাতে বর্গ বাঁধাই হবে। এখন আপনি passedTextআপনার <includeট্যাগটিতে স্ট্রিং পাস করতে পারেন ।

activity_main.xml

<?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">

    <LinearLayout
        ..
        >

        <include
            android:id="@+id/includedLayout"
            layout="@layout/layout_common"
            app:passedText="@{@string/app_name}" // here we pass any String 
            />

    </LinearLayout>
</layout>
  • আপনি এখন binding.includedLayout.textViewআপনার ক্লাসে ব্যবহার করতে পারেন ।
  • আপনি উপরের মতো অন্তর্ভুক্ত বিন্যাসে কোনও ভেরিয়েবল পাস করতে পারেন।

    ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    binding.includedLayout.textView.setText("text");

দ্রষ্টব্য উভয় বিন্যাস (পিতামাত এবং অন্তর্ভুক্ত) হওয়া উচিত binding layout, মোড়ানো উচিত<layout


আপনার উত্তরে আপনি সেটটেক্সট ইভেন্টটিকে প্রোগ্রামালিটি হ্যান্ডেল করেছেন, টেক্সটভিউয়ের পরিবর্তে এটি যদি একটি বোতাম হত তবে আপনি কীভাবে ক্লিকের ইভেন্টটি পরিচালনা binding.includedLayout.button.setOnClickListenerকরতে পারেন I আমি জানি যে প্রোগ্রামিয়ালি বিকল্প হতে পারে তবে আমি onClickযদি এক্সএমএলটিতে বৈশিষ্ট্যটি ব্যবহার করতে চাই তবে কী হবে নিজেই?
আইক্যান্টসি

আপনি OnClickListenerঅন্তর্ভুক্ত লেআউটে পাস করতে পারেন । এমনকি আপনি বাইন্ডিংয়ে কিছু পাস করতে পারেন। এই উত্তরটি চেক করুন, আপনার আরও সাহায্যের প্রয়োজন হলে আমাকে জানান know stackoverflow.com/a/51722829/6891563
Khemraj

1
যখন আমি এটি করি, আমি কেবল একটি ফাঁকা ক্ষেত্র পাই passedText। পার্থক্যটি হ'ল আমি মেইনএকটিভিটি কোডটি অন্তর্ভুক্ত করি না কারণ আমি কেবল স্ট্রিং রিসোর্সটি <অন্তর্ভুক্ত> এ পাস করতে চাই এবং এটিকে ছেড়ে চলে যেতে চাই। কেন এটি সর্বদা ফাঁকা থাকে?
এলিপটিকা

3

এর উপর অন্য একটি আকর্ষণীয় বিষয় হ'ল আপনি বাইন্ডার থেকে আমদানি করা বিন্যাসে ভেরিয়েবলগুলি এ জাতীয় পাস করতে পারেন:

MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.setVariable(BR.varID, variable)

3

আপনি নিজের বাঁধাইয়ের কাজটি এটির জন্য কেবল একটি আইডি যুক্ত করতে অন্তর্ভুক্ত করতে পারেন:

<include
            android:id="@+id/loading"
            layout="@layout/loading_layout"
            bind:booleanVisibility="@{viewModel.showLoading}" />

2

আপনার অন্তর্ভুক্ত বিন্যাসের জন্য কেবল একটি আইডি সেট করুন

    <include
        android:id="@+id/layout"
        layout="@layout/buttons" />

তারপর

BUTTONSBINDING binding = yourMainBinding.layout;

BUTTONSBINDING রেজ / লেআউট / বোতাম.এক্সএমএল

এখন:

binding.button.setText("simple_Way");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.