সিন্থেটিক দর্শন সহ ভিউবাইন্ডিং বনাম কোটলিন অ্যান্ড্রয়েড এক্সটেনশানগুলি


38

নতুন ভিউবাইন্ডিং কীভাবে সিন্থেটিক ভিউ বাইন্ডিংগুলির সাথে কোটলিন অ্যান্ড্রয়েড এক্সটেনশনের তুলনা করে ?

নতুন ভিউবাইন্ডিংগুলি সরবরাহ করে নালস্যাফটি এবং টাইপস্যাফটিটি তৈরি করুন, কেন আমাদের ভিউগুলিতে সিন্থেটিক বাইন্ডিং ব্যবহারের কোটলিন পথটি খাঁজতে বিবেচনা করা উচিত।

নতুন ভিউবাইন্ডিং হ'ল যেহেতু এটি আগে বাঁধাই ক্লাস তৈরি করে?


আমি আলোচনার ক্ষেত্রে কিছুটা অনুরূপ প্রশ্ন তৈরি করেছি kot এই বিষয়ে কারও যদি ভাবনা থাকে তবে বিনা দ্বিধায় প্রতিক্রিয়া জানান :)
xinaiz

1
কটাক্ষপাত আর্গুমেন্ট Kotlin synthetics ওভার আরো কিছু পটভূমির জন্য।
চেটিক্যাম্প

উত্তর:


69

আসুন দু'টি পর্যালোচনা করা যাক।


কনফিগারেশন

কোটলিন অ্যান্ড্রয়েড এক্সটেনশানস

  1. উপযুক্ত লেআউট সিন্থেটিক এক্সটেনশানগুলি আমদানি করুন: import kotlinx.android.synthetic.main.<layout>.*
  2. তাদের আইডি মাধ্যমে কোডে মতামত রেফারেন্স: textView.text = "Hello, world!"। এই এক্সটেনশানগুলি কাজ: Activities, Fragmentsএবং Views

বাইন্ডিং দেখুন

  1. আপনার শ্রেণীর মধ্যে বাইন্ডিং রেফারেন্স তৈরি করুন: private lateinit var binding YourClassBinding
  2. আপনার বাঁধাই ফোলান binding = YourClassBinding.inflate(layoutInflater)ভিতরে Activity'র onCreateএবং কল setContentView(binding.root), অথবা এটি মধ্যে ফোলান Fragment' s onCreateViewতারপর তা ফেরত:return binding.root
  3. কোডগুলিতে রেফারেন্সের দর্শনগুলি তাদের আইডি ব্যবহার করে বাঁধাইয়ের মাধ্যমে binding.textView.text = "Hello, world!"

সুরক্ষা টাইপ করুন

কোটলিন অ্যান্ড্রয়েড এক্সটেনশানস এবং ভিউবাইন্ডিং সংজ্ঞা অনুসারে প্রকারের সুরক্ষিত, কারণ রেফারেন্স করা ভিউগুলি ইতিমধ্যে উপযুক্ত প্রকারে কাস্ট করা থাকে।


নাল সুরক্ষা

কোটলিন অ্যান্ড্রয়েড এক্সটেনশন এবং ভিউবাইন্ডিং উভয়ই নাল নিরাপদ। ভিউবাইন্ডিংয়ের এখানে কোনও সুবিধা নেইকেএই এর ক্ষেত্রে যদি ভিউটি কিছু লেআউট কনফিগারেশনে উপস্থিত থাকে তবে আইডিই আপনাকে এটি নির্দেশ করবে:

এখানে চিত্র বর্ণনা লিখুন

সুতরাং আপনি এটিকে কোটলিনে অন্য কোনও প্র্রজনীয় প্রকারের মতোই আচরণ করুন এবং ত্রুটিটি অদৃশ্য হয়ে যাবে:

এখানে চিত্র বর্ণনা লিখুন


বিন্যাসের পরিবর্তনগুলি প্রয়োগ করা হচ্ছে

কোটলিন অ্যান্ড্রয়েড এক্সটেনশনের ক্ষেত্রে , বিন্যাসের পরিবর্তনগুলি তাত্ক্ষণিক সিন্থেটিক এক্সটেনশানগুলির উত্সে অনুবাদ করে, আপনি এখনই এগুলি ব্যবহার করতে পারেন। ভিউবাইন্ডিংয়ের ক্ষেত্রে আপনাকে আপনার প্রকল্পটি তৈরি করতে হবে


ভুল লেআউট ব্যবহার

কোটলিন অ্যান্ড্রয়েড এক্সটেনশনের ক্ষেত্রে , ভুল লেআউট সিন্থেটিক এক্সটেনশানগুলি আমদানি করা সম্ভব, যার ফলে NullPointerException। একইভাবে ভিউবাইন্ডিংয়ের ক্ষেত্রে প্রযোজ্য , যেহেতু আমরা ভুল Bindingশ্রেণি আমদানি করতে পারি । যদিও, এটি ভুল শ্রেণীর নামের চেয়ে ভুল আমদানিকে উপেক্ষা করার সম্ভাবনা বেশি, বিশেষত যদি লেআউট ফাইলটি Activity/ Fragment/ এর পরে নামকরণ করা হয় View, সুতরাং এখানে ভিউবাইন্ডিংয়ের উপরের হাত রয়েছে।


কেএই বনাম ভিউবাইন্ডিংয়ের সংক্ষিপ্তসার

  • সুরক্ষা টাইপ করুন - আঁকুন।
  • নাল সুরক্ষা - আঁকুন।
  • বয়লারপ্লেট কোড - কেএই জিতল । কোটলিন অ্যান্ড্রয়েড এক্সটেনশনের ডকুমেন্টেশন থেকে :

কোটলিন অ্যান্ড্রয়েড এক্সটেনশানস প্লাগইন আমাদের কোনও অতিরিক্ত কোড যুক্ত না করে এই লাইব্রেরির সাথে আমাদের একই অভিজ্ঞতা অর্জনের অনুমতি দেয়।

  • লেআউট পরিবর্তনগুলি প্রয়োগ করে - কেএই জিতল । পরিবর্তনগুলি ভিউবাইন্ডিংয়ের বিপরীতে তাত্ক্ষণিক ।
  • ভুল লেআউট ব্যবহার - ভিউবাইন্ডিংয়ের জয়

আমি মনে করি সম্পর্কে বড় ভুল ধারণা আছে ViewBinding হচ্ছে প্রতিস্থাপন Kae । লোকেরা বড় কীওয়ার্ড শুনে এবং এটিকে আগে যাচাই না করে পুনরাবৃত্তি করে। নিশ্চিত, ViewBinding জাভা উন্নয়নের জন্য ডান এখন সবচেয়ে ভাল বিকল্প (জন্য প্রতিস্থাপন ButterKnife ), কিন্তু ওইখানে নেই বা সামান্য সুবিধা Kae Kotlin মধ্যে (দেখুন ভুল বিন্যাস ব্যবহার অধ্যায়)।

পার্শ্ব দ্রষ্টব্য: আমি নিশ্চিত ডেটাবাইন্ডিংয়ের লোকেরা ভিউবাইন্ডিং পছন্দ করবে :)


আপনি ভেরিয়েবলগুলি ব্যবহার সম্পর্কে কিছু বলেননি কেন DataBinding? আমি মনে করি একেবারে দেখার রেফারেন্স ব্যবহার বন্ধ করা এটি প্রয়োজনীয় বৈশিষ্ট্য। যাইহোক, আপনি <include ... />ট্যাগগুলির মাধ্যমে আপনার ভিউ মডেলটিকে "নিক্ষেপ" করতে পারেন , এটি আর একটি বড় সুবিধা।
ইরকভার

1
@ ইরকভার প্রশ্নটি কেএই এবং ভিউবাইন্ডিংয়ের তুলনা সম্পর্কে ছিল। ডেটাবাইন্ডিং এই প্রশ্নের অংশ নয়।
xinaiz

ওফস, দুঃখিত) সাধারণ ভুল বোঝাবুঝি।
ইরকভার

1
@ বেনলিউস যদি আপনার বাঁধাই ল্যাটিনাইট হিসাবে সংজ্ঞায়িত হয় তবে আপনার এখনও একই সমস্যা রয়েছে। তার অর্থ আপনি কেএই বা ভিউবাইন্ডিং যা ব্যবহার করেন তার কোনও মিটার নেই খণ্ডে কোড লেখার সময় আপনাকে কিছু কঠোর নিয়ম মেনে চলতে হবে।
ফ্ল্যাভিও

1
"লেআউট পরিবর্তনগুলি প্রয়োগ করা হচ্ছে" - ভিউবাইন্ডিং ব্যবহার করার সময়, আপনাকে একটি প্রকল্প তৈরি করতে হবে না, একটি আইডি দিয়ে একটি নতুন ভিউ যুক্ত করার পরে, আপনি তাত্ক্ষণিকভাবে "বাইন্ডিং.মিটেক্সটভিউ .." করতে পারেন।
তৈয়ব মাজহার

19

ViewBindingসবচেয়ে বড় সমস্যা সমাধান kotlinx.android.synthetic। ইন syntheticবাঁধাই আপনি একটি লেআউটে আপনার সামগ্রী দেখতে সেট, তারপর একটি আইডি টাইপ করুন যেটি শুধুমাত্র একটি ভিন্ন বিন্যাস বিদ্যমান, আইডিই আপনি স্বয়ংসম্পূর্ণ এবং নতুন ইম্পোর্ট বিবৃতিটি যোগ করতে দেয়। বিকাশকারীরা তাদের আমদানির বিবৃতিগুলি কেবলমাত্র সঠিক দর্শনগুলি আমদানি করে তা নিশ্চিত করার জন্য যদি না পরীক্ষা করে না ফেলে তা যাচাই করার কোনও নিরাপদ উপায় নেই যা এটি রানটাইম সমস্যা সৃষ্টি করবে না। তবে এতে ViewBindingআপনার layoutদৃশ্যের অ্যাক্সেসের জন্য আপনার বাঁধাই করা অবজেক্টটি ব্যবহার করা উচিত যাতে আপনি কখনও ভিন্ন বিন্যাসে কোনও দৃশ্যের কাছে প্রার্থনা করেন না এবং যদি আপনি এটি করতে চান তবে একটি রানটাইম ত্রুটি নয় একটি সংকলন ত্রুটি পাবেন। এখানে একটি উদাহরণ।

আমরা দুটি লেআউট কল করি activity_mainএবং এটি activity_otherপছন্দ করি:

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

    <TextView
        android:id="@+id/message_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</RelativeLayout>

activity_other.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                >

    <TextView
        android:id="@+id/message_other"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</RelativeLayout>

এখন আপনি যদি আপনার ক্রিয়াকলাপটি এভাবে লিখেন:

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_other.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //Application will crash because "message_other" doesn't exist in "activity_main"
        message_other.text = "Hello!"
    }
}

আপনার কোডটি কোনও ত্রুটি ছাড়াই সংকলন করবে তবে আপনার অ্যাপ্লিকেশনটি রানটাইমের সময় ক্রাশ হবে। কারণ message_otherআইডি সহ দর্শন উপস্থিত নেই activity_mainএবং সংকলক এটি পরীক্ষা করে নি। তবে আপনি যদি এর ViewBindingমতো ব্যবহার করেন :

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        //This code will never compile and the IDE shows you an error
        binding.message_other.text = "Hello!"
    }
}

আপনার কোডটি কখনই সংকলন করবে না এবং Android Studioশেষ লাইনে আপনাকে একটি ত্রুটি দেখায়।


1
আপনি ভিউতে স্ফীত করতে লেআউটআইনফ্লেটার ব্যবহার করতে পারেন এবং তারপরে ভেরিয়েবলের মাধ্যমে এর সংজ্ঞায়িত ক্ষেত্রগুলি উল্লেখ করতে পারেন।
নেপোলিয়ন

4
বাস্তব জীবনের দৃশ্যে এটি হওয়ার সম্ভাবনা খুব কম বলে মনে হয়।
বেনক্রিট

1
উদাহরণটি বোঝায় না। আপনি এটি ভুলভাবে ব্যবহার করেছেন। আপনি কেন ভুল জিনিস আমদানি করবেন (ক্রিয়াকলাপ_অন্য)? আপনি যে ফ্রেমওয়ার্কটি ভুলভাবে ব্যবহার করেন তা সমস্যার কারণ হতে পারে।
অ্যান্ড্রয়েড বিকাশকারী

2

কোটলিনেক্স.অ্যান্ড্রয়েড.সেন্টিথেটিক আর একটি প্রস্তাবিত অনুশীলন নয়, গুগল দ্বারা একটি প্রতিশ্রুতি বার্তায় বলেছিলেন "রেডডিট থ্রেডের একটি

https://android-review.googlesource.com/c/platform/frameworks/support/+/882241 "

সিনথেটিক্স গুগল দ্বারা বিকাশিত নয়, এটি জেটব্রেইনস দ্বারা রচিত কোটলিন অ্যান্ড্রয়েড এক্সটেনশনের একটি অংশ এবং ধীরে ধীরে গুগল অ্যান্ড্রয়েড বিকাশকারীরা তাদের ডেমো এবং উত্স-কোডগুলিতে সিন্থেটিকগুলি ভিউবিন্ডিনগুলির সাথে প্রতিস্থাপন শুরু করে।

"এখন প্রশ্ন আসে, কোনটি আমাদের বিবেচনায় নিতে হবে।"

গুগলের মতে (বাইন্ডিং, বাটারনিফ, কোটলিন সিনথেটিকস দেখুন) এই লাইব্রেরিগুলি অনেক অ্যাপ্লিকেশন সফলভাবে ব্যবহার করে এবং একই সমস্যা সমাধান করে।

তবে গুগল বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য এই লাইব্রেরির পরিবর্তে ভিউ বাইন্ডিং ব্যবহার করে দেখার চেষ্টা করে কারণ ভিউ বাইন্ডিং নিরাপদ, আরও সংক্ষিপ্ত ভিউ লুকে দেয়।

জিনিসগুলি দ্রুত সাফ করার জন্য রেফারেন্স চিত্র সংযুক্ত করা হয়েছে। এখানে চিত্র বর্ণনা লিখুন

তবে আপনি যদি ডিপিতে যেতে চান তবে নীচের লিঙ্কটি অনুসরণ করতে পারেন। https://medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c83942471fc


2
1. সর্বদা নাল-নিরাপদ - মূল্যবৃদ্ধির আগে বা জীবনচক্র সমাপ্তির পরে যদি ব্যবহার বাঁধাই হয় তবে ক্র্যাশ হবে - সিন্থেটিক থেকে আলাদা কিছু নয় - ভিউবাইন্ডিংয়ের জন্য লাল হওয়া উচিত। ২. কেবলমাত্র বর্তমান লেআউট থেকে রেফারেন্স আইডি - এটি সত্য, তবে আইডিই আপনাকে কোন লেআউট থেকে প্রদত্ত আইডি আমদানি করতে চান তা নির্দেশ করে, তাই এটি কোনও বড় সমস্যা নয়। 3. কোটলিন এবং জাভা সমর্থন করে - খারাপ যুক্তি, আপনি যদি অ্যান্ড্রয়েড বিকাশে কোটলিন ব্যবহার করতে পারেন তবে জাভা কেন ব্যবহার করবেন। ৪. প্রয়োজনীয় কোডের পরিমাণ - কোটলিন সিনথেটিক্সের পরিমাণ সর্বনিম্ন, টেবিলে খুব কম হওয়া উচিত।
xinaiz

@ xinaiz কেন আপনি এটি উত্সাহ দেওয়ার আগে ব্যবহার করছেন, অন্যথায় নিশ্চিত যে আপনি সমস্যার মুখোমুখি হবেন তা সঠিকভাবে অনুসরণ করুন। আপনি downvote আগে লিঙ্কের মাধ্যমে সর্বস্বান্ত এবং মন্তব্য পোস্টিং হয়েছে medium.com/androiddevelopers/...
SourabhTech

হ্যাঁ, আমি এটি কিছুক্ষণ আগে পড়েছি। আমি এটি স্ফীতকরণের আগে ব্যবহার করছি না, আমি কেবল বলছি এটি সম্ভব। "সঠিক উপায়" বোঝায় যে ঝুঁকি আছে, তাই না? এছাড়াও, আপনি কিছু বাদ দিয়েছেন or after view lifecycle ends?
xinaiz

@xinaiz 2. তবে প্রকল্পটি বড় হলে ভুল আইডি ব্যবহার করার সুযোগ রয়েছে এবং একই সাথে যদি একাধিক বিকাশকারী প্রকল্পে কাজ করে তবে একই সংস্থান নামের জন্যও। ৩.হ্যাঁ এমন কোনও প্রকল্পের প্রয়োজন হতে পারে যেখানে আপনাকে জাভা এবং কোটলিন উভয়ই ব্যবহার করতে হবে (যদি প্রকল্পটি ইতিমধ্যে জাভাতে বিকাশিত হয়ে কোটলিনের সাথে অনুপ্রবেশ শুরু করা হয় তবে অবশ্যই এটি সহায়তা করে) ৪. সিনথেটিক্সের জন্য আপনাকে আলাদা লাইব্রেরি আমদানি করতে হবে তবে দেখার জন্য বাধ্যতামূলক এটি ইতিমধ্যে গ্রেডলে রয়েছে, সুতরাং স্পষ্টতই এটি কম কোড নিয়েছে।
সৌরভটেক

1
4 এর প্রতিক্রিয়া হিসাবে 4 কোন লাইব্রেরি? এটি ডিফল্টরূপে সক্ষম করা হয়েছে। এটি apply plugin: 'kotlin-android-extensions'বনাম সম্পর্কে তর্ক viewBinding { enabled = true }। খুব বেশি পার্থক্য নেই।
xinaiz
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.