অ্যান্ড্রয়েড জেটপ্যাকের বাইন্ডিং অংশ দেখুন।
ভিউ বাইন্ডিং এমন একটি বৈশিষ্ট্য যা ভিউগুলির সাথে ইন্টারঅ্যাক্ট করে এমন কোড লেখা সহজ করে তোলে। একবার একটি মডিউলে ভিউ বাইন্ডিং সক্ষম করা হলে, এটি সেই মডিউলে উপস্থিত প্রতিটি XML লেআউট ফাইলের জন্য একটি বাইন্ডিং ক্লাস তৈরি করে। একটি বাইন্ডিং ক্লাসের একটি উদাহরণে সংশ্লিষ্ট লেআউটে একটি আইডি আছে এমন সমস্ত দর্শনের সরাসরি উল্লেখ থাকে।
বেশিরভাগ ক্ষেত্রে, ভিউ বাইন্ডিং findViewById
প্রতিস্থাপন করে।
সেটআপ
মডিউল-বাই-মডিউল ভিত্তিতে ভিউ বাইন্ডিং সক্ষম করা হয়েছে। একটি মডিউলে ভিউ বাইন্ডিং সক্ষম করতে, মডিউল-স্তরের build.gradle
ফাইলে viewBinding
বিল্ড বিকল্পটিকে true
হিসাবে সেট করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
গ্রোভি
android { ... buildFeatures { viewBinding true } }
কোটলিন
android { ... buildFeatures { viewBinding = true } }
বাইন্ডিং ক্লাস তৈরি করার সময় যদি আপনি একটি লেআউট ফাইলকে উপেক্ষা করতে চান, তাহলে সেই লেআউট ফাইলের রুট ভিউতে tools:viewBindingIgnore="true"
যোগ করুন:
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
ব্যবহার
যদি একটি মডিউলের জন্য ভিউ বাইন্ডিং সক্ষম করা থাকে, মডিউলটিতে থাকা প্রতিটি XML লেআউট ফাইলের জন্য একটি বাইন্ডিং ক্লাস তৈরি করা হয়। প্রতিটি বাইন্ডিং ক্লাসে রুট ভিউ এবং আইডি আছে এমন সমস্ত ভিউ এর রেফারেন্স থাকে। XML ফাইলের নামকে Pascal কেসে রূপান্তর করে এবং শেষে "Binding" শব্দটি যোগ করে বাইন্ডিং ক্লাসের নাম তৈরি করা হয়।
উদাহরণস্বরূপ, result_profile.xml
নামক একটি লেআউট ফাইল বিবেচনা করুন যাতে নিম্নলিখিতগুলি রয়েছে:
<LinearLayout ... >
<TextView android:id="@+id/name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/button"
android:background="@drawable/rounded_button" />
</LinearLayout>
উৎপন্ন বাইন্ডিং ক্লাসকে ResultProfileBinding
বলা হয়। এই ক্লাসে দুটি ক্ষেত্র রয়েছে: একটি TextView
name
বলা হয় এবং একটি Button
নামক button
। লেআউটের ImageView
এর কোনো ID নেই, তাই বাইন্ডিং ক্লাসে এর কোনো রেফারেন্স নেই।
প্রতিটি বাইন্ডিং ক্লাসে একটি getRoot()
পদ্ধতি অন্তর্ভুক্ত থাকে, যা সংশ্লিষ্ট লেআউট ফাইলের রুট ভিউয়ের জন্য সরাসরি রেফারেন্স প্রদান করে। এই উদাহরণে, ResultProfileBinding
ক্লাসে getRoot()
পদ্ধতি LinearLayout
রুট ভিউ প্রদান করে।
নিম্নলিখিত বিভাগগুলি ক্রিয়াকলাপ এবং খণ্ডগুলিতে জেনারেট করা বাঁধাই ক্লাসের ব্যবহার প্রদর্শন করে।
কার্যকলাপে ভিউ বাইন্ডিং ব্যবহার করুন
একটি কার্যকলাপের সাথে ব্যবহারের জন্য বাইন্ডিং ক্লাসের একটি উদাহরণ সেট আপ করতে, কার্যকলাপের onCreate()
পদ্ধতিতে নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:
- জেনারেট বাইন্ডিং ক্লাসে অন্তর্ভুক্ত স্ট্যাটিক
inflate()
পদ্ধতিটিকে কল করুন। এটি ব্যবহার করার জন্য কার্যকলাপের জন্য বাইন্ডিং ক্লাসের একটি উদাহরণ তৈরি করে। -
getRoot()
পদ্ধতিতে কল করে অথবা Kotlin প্রপার্টি সিনট্যাক্স ব্যবহার করে রুট ভিউয়ের একটি রেফারেন্স পান। - রুট ভিউকে
setContentView()
এ পাস করুন যাতে এটি স্ক্রিনে সক্রিয় ভিউ হয়।
এই পদক্ষেপগুলি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
কোটলিন
private lateinit var binding: ResultProfileBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ResultProfileBinding.inflate(layoutInflater) val view = binding.root setContentView(view) }
জাভা
private ResultProfileBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ResultProfileBinding.inflate(getLayoutInflater()); View view = binding.getRoot(); setContentView(view); }
আপনি এখন যেকোন মতামত উল্লেখ করতে বাইন্ডিং ক্লাসের উদাহরণ ব্যবহার করতে পারেন:
কোটলিন
binding.name.text = viewModel.name binding.button.setOnClickListener { viewModel.userClicked() }
জাভা
binding.name.setText(viewModel.getName()); binding.button.setOnClickListener(new View.OnClickListener() { viewModel.userClicked() });
খণ্ডে ভিউ বাইন্ডিং ব্যবহার করুন
একটি খণ্ডের সাথে ব্যবহারের জন্য বাইন্ডিং ক্লাসের একটি উদাহরণ সেট আপ করতে, খণ্ডের onCreateView()
পদ্ধতিতে নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:
- জেনারেট বাইন্ডিং ক্লাসে অন্তর্ভুক্ত স্ট্যাটিক
inflate()
পদ্ধতিটিকে কল করুন। এটি ফ্র্যাগমেন্ট ব্যবহারের জন্য বাইন্ডিং ক্লাসের একটি উদাহরণ তৈরি করে। -
getRoot()
পদ্ধতিতে কল করে অথবা Kotlin প্রপার্টি সিনট্যাক্স ব্যবহার করে রুট ভিউয়ের একটি রেফারেন্স পান। -
onCreateView()
পদ্ধতি থেকে রুট ভিউ ফিরিয়ে আনুন যাতে এটি স্ক্রিনে সক্রিয় ভিউ হয়।
কোটলিন
private var _binding: ResultProfileBinding? = null // This property is only valid between onCreateView and // onDestroyView. private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { _binding = ResultProfileBinding.inflate(inflater, container, false) val view = binding.root return view } override fun onDestroyView() { super.onDestroyView() _binding = null }
জাভা
private ResultProfileBinding binding; @Override public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = ResultProfileBinding.inflate(inflater, container, false); View view = binding.getRoot(); return view; } @Override public void onDestroyView() { super.onDestroyView(); binding = null; }
আপনি এখন যেকোন মতামত উল্লেখ করতে বাইন্ডিং ক্লাসের উদাহরণ ব্যবহার করতে পারেন:
কোটলিন
binding.name.text = viewModel.name binding.button.setOnClickListener { viewModel.userClicked() }
জাভা
binding.name.setText(viewModel.getName()); binding.button.setOnClickListener(new View.OnClickListener() { viewModel.userClicked() });
বিভিন্ন কনফিগারেশনের জন্য ইঙ্গিত প্রদান করুন
আপনি যখন একাধিক কনফিগারেশন জুড়ে ভিউ ঘোষণা করেন, তখন মাঝে মাঝে নির্দিষ্ট লেআউটের উপর নির্ভর করে একটি ভিন্ন ভিউ টাইপ ব্যবহার করা বোধগম্য হয়। নিম্নলিখিত কোড স্নিপেট এর একটি উদাহরণ দেখায়:
# in res/layout/example.xml
<TextView android:id="@+id/user_bio" />
# in res/layout-land/example.xml
<EditText android:id="@+id/user_bio" />
এই ক্ষেত্রে, আপনি আশা করতে পারেন যে তৈরি করা ক্লাসটি TextView
টাইপের একটি ফিল্ড userBio
প্রকাশ করবে, কারণ TextView
হল সাধারণ বেস ক্লাস। প্রযুক্তিগত সীমাবদ্ধতার কারণে, ভিউ বাইন্ডিং কোড জেনারেটর এটি নির্ধারণ করতে পারে না এবং পরিবর্তে একটি View
ক্ষেত্র তৈরি করে। এর জন্য binding.userBio as TextView
দিয়ে পরে ফিল্ডটি কাস্ট করা প্রয়োজন।
এই সীমাবদ্ধতাকে ঘিরে কাজ করার জন্য, ভিউ বাইন্ডিং একটি tools:viewBindingType
অ্যাট্রিবিউটকে সমর্থন করে, যা আপনাকে কম্পাইলারকে জানাতে দেয় যে জেনারেট করা কোডে কী ধরনের ব্যবহার করতে হবে। পূর্ববর্তী উদাহরণে, আপনি কম্পাইলারটিকে একটি TextView
হিসাবে ক্ষেত্র তৈরি করতে এই বৈশিষ্ট্যটি ব্যবহার করতে পারেন:
# in res/layout/example.xml (unchanged)
<TextView android:id="@+id/user_bio" />
# in res/layout-land/example.xml
<EditText android:id="@+id/user_bio" tools:viewBindingType="TextView" />
অন্য একটি উদাহরণে, ধরুন আপনার দুটি লেআউট রয়েছে, একটিতে একটি BottomNavigationView
রয়েছে এবং অন্যটিতে একটি NavigationRailView
রয়েছে। উভয় শ্রেণীই NavigationBarView
প্রসারিত করে, যেটিতে বেশিরভাগ বাস্তবায়নের বিবরণ রয়েছে। বর্তমান লেআউটে কোন সাবক্লাসটি উপস্থিত রয়েছে তা যদি আপনার কোডের সঠিকভাবে জানার প্রয়োজন না হয়, তাহলে আপনি উভয় লেআউটে জেনারেট করা টাইপটিকে NavigationBarView
এ সেট করতে tools:viewBindingType
ব্যবহার করতে পারেন:
# in res/layout/navigation_example.xml
<BottomNavigationView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />
# in res/layout-w720/navigation_example.xml
<NavigationRailView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />
কোড তৈরি করার সময় ভিউ বাইন্ডিং এই অ্যাট্রিবিউটের মান যাচাই করতে পারে না। কম্পাইল-টাইম এবং রানটাইম ত্রুটিগুলি এড়াতে, মানটিকে অবশ্যই নিম্নলিখিত শর্তগুলি পূরণ করতে হবে:
- মানটি অবশ্যই একটি শ্রেণী হতে হবে যা
android.view.View
থেকে উত্তরাধিকারসূত্রে পাওয়া যায়। মানটি যে ট্যাগের উপর স্থাপন করা হয়েছে তার একটি সুপারক্লাস হতে হবে। উদাহরণস্বরূপ, নিম্নলিখিত মানগুলি কাজ করে না:
<TextView tools:viewBindingType="ImageView" /> <!-- ImageView is not related to TextView. --> <TextView tools:viewBindingType="Button" /> <!-- Button is not a superclass of TextView. -->
চূড়ান্ত প্রকারটি অবশ্যই সমস্ত কনফিগারেশন জুড়ে ধারাবাহিকভাবে সমাধান করতে হবে।
FindViewById থেকে পার্থক্য
findViewById
ব্যবহার করে ভিউ বাইন্ডিংয়ের গুরুত্বপূর্ণ সুবিধা রয়েছে:
- নাল নিরাপত্তা: যেহেতু ভিউ বাইন্ডিং ভিউয়ের সরাসরি রেফারেন্স তৈরি করে, তাই একটি অবৈধ ভিউ আইডির কারণে নাল পয়েন্টার ব্যতিক্রম হওয়ার ঝুঁকি নেই। উপরন্তু, যখন একটি দৃশ্য শুধুমাত্র একটি লেআউটের কিছু কনফিগারেশনে উপস্থিত থাকে, তখন বাইন্ডিং ক্লাসে এর রেফারেন্স ধারণকারী ক্ষেত্রটি
@Nullable
দিয়ে চিহ্নিত করা হয়। - টাইপ সেফটি: প্রতিটি বাইন্ডিং ক্লাসের ক্ষেত্রগুলিতে XML ফাইলে উল্লেখ করা ভিউগুলির সাথে মিলে যায়। এর মানে ক্লাস কাস্ট ব্যতিক্রমের কোন ঝুঁকি নেই।
এই পার্থক্যগুলি আপনার লেআউট এবং আপনার কোডের মধ্যে অসঙ্গতি বোঝায় যার ফলে আপনার বিল্ড রানটাইমের পরিবর্তে কম্পাইল টাইমে ব্যর্থ হয়।
ডেটা বাইন্ডিংয়ের সাথে তুলনা
ভিউ বাইন্ডিং এবং ডেটা বাইন্ডিং উভয়ই বাইন্ডিং ক্লাস তৈরি করে যা আপনি সরাসরি ভিউ উল্লেখ করতে ব্যবহার করতে পারেন। যাইহোক, ভিউ বাইন্ডিং সহজ ব্যবহারের ক্ষেত্রে পরিচালনা করার উদ্দেশ্যে এবং ডেটা বাইন্ডিং এর উপর নিম্নলিখিত সুবিধা প্রদান করে:
- দ্রুত সংকলন: ভিউ বাইন্ডিংয়ের জন্য কোন টীকা প্রক্রিয়াকরণের প্রয়োজন নেই, তাই কম্পাইলের সময় দ্রুত হয়।
- ব্যবহারের সহজলভ্য: ভিউ বাইন্ডিংয়ের জন্য বিশেষভাবে ট্যাগ করা XML লেআউট ফাইলের প্রয়োজন হয় না, তাই আপনার অ্যাপে এটি গ্রহণ করা আরও দ্রুত। একবার আপনি একটি মডিউলে ভিউ বাইন্ডিং সক্ষম করলে, এটি সেই মডিউলের সমস্ত লেআউটে স্বয়ংক্রিয়ভাবে প্রযোজ্য হয়।
অন্যদিকে, ডেটা বাইন্ডিংয়ের তুলনায় ভিউ বাইন্ডিংয়ের নিম্নলিখিত সীমাবদ্ধতা রয়েছে:
- ভিউ বাইন্ডিং লেআউট ভেরিয়েবল বা লেআউট এক্সপ্রেশন সমর্থন করে না, তাই এটি সরাসরি XML লেআউট ফাইল থেকে ডায়নামিক UI বিষয়বস্তু ঘোষণা করতে ব্যবহার করা যাবে না।
- ভিউ বাইন্ডিং দ্বিমুখী ডেটা বাইন্ডিং সমর্থন করে না।
এই বিবেচনার কারণে, কিছু ক্ষেত্রে একটি প্রকল্পে ভিউ বাইন্ডিং এবং ডেটা বাইন্ডিং উভয়ই ব্যবহার করা ভাল। আপনি এমন লেআউটগুলিতে ডেটা বাইন্ডিং ব্যবহার করতে পারেন যার জন্য উন্নত বৈশিষ্ট্যগুলির প্রয়োজন হয় এবং যে লেআউটগুলি নেই সেগুলিতে ভিউ বাইন্ডিং ব্যবহার করতে পারেন৷
অতিরিক্ত সম্পদ
ভিউ বাইন্ডিং সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত সংস্থানগুলি দেখুন:
নমুনা
ব্লগ
ভিডিও
{% শব্দার্থে %}আপনার জন্য প্রস্তাবিত
- দ্রষ্টব্য: জাভাস্ক্রিপ্ট বন্ধ থাকলে লিঙ্ক টেক্সট প্রদর্শিত হয়
- কোটলিন সিন্থেটিক্স থেকে জেটপ্যাক ভিউ বাইন্ডিং-এ স্থানান্তর করুন
- লেআউট এবং বাইন্ডিং এক্সপ্রেশন
- অ্যাপ আর্কিটেকচার: UI স্তর - শুরু করুন - অ্যান্ড্রয়েড বিকাশকারীরা৷