ভিউবাইন্ডিং - অন্তর্ভুক্ত লেআউটগুলির জন্য বাইন্ডিং কিভাবে পাবেন?


10

ভিউবাইন্ডিংয়ের সাথে কাজ করার সময় আমি কয়েকটি নথিভুক্ত মামলাগুলি দেখতে পাই।

প্রথম: অন্তর্ভুক্ত জেনেরিক ভিউ লেআউট অংশগুলির জন্য প্রধান বাঁধাই কেবলমাত্র প্রধান বিন্যাসে আইটেমগুলি দেখতে কীভাবে বাধ্য?

দ্বিতীয়: অন্তর্ভুক্ত মার্জ টাইপের লেআউট অংশগুলির জন্য কীভাবে বাধ্যবাধকতা পেতে, আবার মূল বাঁধাই কেবলমাত্র প্রধান বিন্যাসে আইটেমগুলি দেখতে পারে?

উত্তর:


13

জন্য:

  1. জেনেরিক লেআউট (অন্তর্ভুক্ত নোড নয়) সহ অন্তর্ভুক্ত করুন, আমাদের অন্তর্ভুক্ত অংশের জন্য আইডি নির্ধারণ করতে হবে, বাইন্ডিংয়ের মাধ্যমে আমাদের অন্তর্ভুক্ত সাব অংশে অ্যাক্সেস থাকবে
<include
    android:id="@+id/your_id"
    layout="@layout/some_layout" />

আপনার ক্রিয়াকলাপের কোডটিতে এইভাবে:

private lateinit var exampleBinding: ActivityExampleBinding  //activity_example.xml layout

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    exampleBinding = ActivityExampleBinding.inflate(layoutInflater)
    setContentView(exampleBinding.root)
    //we will be able to access included layouts view like this
    val includedView: View = exampleBinding.yourId.idOfIncludedView
//[...]
}
  1. বাহ্যিক বিন্যাসে মার্জ ব্লক সহ অন্তর্ভুক্ত করুন। আমরা এতে আইডি যুক্ত করতে পারি না কারণ মার্জ ব্লকটি কোনও ভিউ নয়। ধরা যাক আমাদের এমন চিরন্তন মার্জ লেআউট রয়েছে (মার্জ_লেআউটআউট.এক্সএম):
<?xml version="1.0" encoding="utf-8"?>
<merge 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"
    tools:showIn="@layout/activity_example">

    <TextView
        android:id="@+id/some_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World" />
</merge>

এই ধরনের মার্জ লেআউটটিকে সঠিকভাবে বাঁধতে আমাদের এগুলি করতে হবে:

আপনার ক্রিয়াকলাপের কোডে:

private lateinit var exampleBinding: ActivityExampleBinding  //activity_example.xml layout
private lateinit var mergeBinding: MergeLayoutBinding  //merge_layout.xml layout

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    exampleBinding = ActivityExampleBinding.inflate(layoutInflater)
    //we need to bind the root layout with our binder for external layout
    mergeBinding = MergeLayoutBinding.bind(exampleBinding.root)
    setContentView(exampleBinding.root)
    //we will be able to access included in merge layout views like this
    val mergedView: View = mergeBinding.someView
//[...]
}

1
এটি একটি বাগের মতো মনে হচ্ছে। এটা ঠিক কাজ করা উচিত ।
মিগুয়েল

7

আপনার প্রথম প্রশ্ন, যা ভিউবাইন্ডিং ব্যবহার করে অন্তর্ভুক্ত বিন্যাসের সাথে কাজ করছে তা এত সহজে সমাধান করা যায়।

এখানে একটি নমুনা প্রধান_ফ্র্যাগমেন্ট.এক্সএমএল ফাইল

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view_main"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

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

</LinearLayout>

এবং মেইনফ্রেগমেন্ট.জভা এটির মতো হতে পারে

public class MeaningFragment extends Fragment {

    private MainFragmentBinding binding;
    private ToolbarBinding toolbarBinding;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

        binding = MainFragmentBinding.inflate(inflater, container, false);
        toolbarBinding = binding.toolbar;

        return binding.getRoot();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        toolbarBinding = null;
        binding = null;
    }
}

এখন, আপনার দুটি বাঁধাই আছে। এর মধ্যে একটি ডিফল্ট এবং পরেরটি অন্তর্ভুক্ত লেআউট থেকে।


1
খুব সহজ উত্তর এবং নতুন বাক্য গঠন ব্যবহার করে - সমস্ত একই ধরণের সিনট্যাক্স সহ একটি অ-খণ্ড ক্রিয়াকলাপে আমার জন্য কাজ করছে onCreate()। ধন্যবাদ। (এটি ব্যবহার করে কেবল কিছুটা সমস্যা হচ্ছে DrawerLayout)
ফ্যাট সন্ন্যাস

0

অন্যান্য সহজ উপায়টি ডেটা বাইন্ডিং লাইব্রেরি ব্যবহার করা হবে। তারপরে আপনার এক্সএমএল লেআউটটিকে ট্যাগ সহ মোড়া করুন যাতে আপনি লাইব্রেরিটি ব্যবহার করছেন যদি স্বয়ংক্রিয়ভাবে আপনার ডেটা অবজেক্টের সাথে বিন্যাসে দৃষ্টিভঙ্গি আবদ্ধ করার জন্য প্রয়োজনীয় ক্লাস তৈরি করা হয়। সত্যিই, আমি মনে করি এটি চলার পথ। এখানে গাইড অনুসরণ করুন

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