ViewBinding - शामिल लेआउट के लिए बाध्यकारी कैसे प्राप्त करें?


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. बाहरी लेआउट में मर्ज ब्लॉक के साथ शामिल करें। हम इसमें ID नहीं जोड़ सकते क्योंकि मर्ज ब्लॉक एक दृश्य नहीं है। मान लें कि हमारे पास ऐसे अनन्त मर्ज लेआउट हैं (merge_layout.xm):
<?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

आपका पहला प्रश्न, जो ViewBinding का उपयोग करके एक सम्मिलित लेआउट के साथ काम कर रहा है, इतनी आसानी से हल किया जा सकता है।

यहाँ एक नमूना main_fragment.xml फ़ाइल है

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

और MainFragment.java इस तरह हो सकता है

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.