როგორ დავამატოთ View Binding Android Gradle პროექტს

View Binding აადვილებს კოდის დაწერას, რომელიც ურთიერთქმედებს ხედებთან. აი, როგორ დააყენოთ ის თქვენს Android Gradle პროექტში.

ანდროიდის დეველოპერების უმეტესობა ალბათ იცნობს კლასიკას findViewById() მეთოდი. გადასვით მას ერთ-ერთი ხედის ID თქვენს XML განლაგებაში და ის დააბრუნებს მითითებას ამ ხედის გაბერილ ვერსიაზე. ეს ყველაფერი არის იმის დაშვებით, რომ თქვენ ჩააბარეთ სწორი ID, და რომ View რეალურად არსებობს. findViewById() არ აქვს ჩაშენებული ჩეკები, რათა თავიდან აიცილოთ ხედის აღდგენის მცდელობა, რომლის აღდგენაც შეუძლებელია. შეიყვანეთ View Binding.

გამოყენების ნაცვლად findViewById() თითოეულ ხედზე, რომელიც გსურთ, View Binding ავტომატურად წარმოქმნის სავალდებულო კლასს თითოეული განლაგებისთვის XML. ID-ის მქონე თითოეული ხედი ავტომატურად ემატება კლასს, ასე რომ თქვენ შეგიძლიათ პირდაპირ მიმართოთ მათ.

View Binding-ის დამატება Android Gradle პროექტში ძალიან მარტივია.

Gradle Setup

View Binding ჩართულია Gradle-ში მოდულის დონეზე. თუ თქვენ გაქვთ რამდენიმე მოდული, თქვენ უნდა ჩართოთ ის ინდივიდუალურად თითოეულისთვის.

ში android დაბლოკვა თქვენს მოდულის დონეზე build.gradle, დაამატეთ ვარიანტი View Binding-ის გასააქტიურებლად.

android {
...

buildFeatures {
viewBinding true
}
}

შეიძლება იყოს გაფრთხილება არალეგალური წვდომის შესახებ, მაგრამ ეს არის ბზის შეცდომა და შეიძლება უსაფრთხოდ უგულებელყო.

პროექტის სინქრონიზაცია და View Binding ჩართული იქნება. ასე ადვილია.

View Binding-ის გამოყენება

View Binding-ის გამოყენების რამდენიმე გზა არსებობს, მაგრამ სანამ ეს მოხდება, მოდით ვისაუბროთ იმაზე, თუ როგორ იქმნება სავალდებულო კლასები.

კლასის სახელების სინტაქსი

თქვით, რომ თქვენ გაქვთ დასახელებული XML განლაგება some_layout.xml. დასახელდება მისი შესაბამისი სავალდებულო კლასი SomeLayoutBinding. ეს ნიმუში მოქმედებს ყველა ფაილზე.

თითოეული სიტყვა (ფაილის სახელში ხაზგასმული ხაზებით გამოყოფილი) ჩაიწერება დიდი ასოებით, ხოლო ქვედა ხაზები წაიშლება. "აკინძვა" შემდეგ ემატება ბოლომდე.

ინსტანცია არსებული ხედით

თუ თქვენ უკვე გაბერეთ განლაგების ფაილი და გაქვთ მითითება განლაგების ძირზე, შეგიძლიათ უთხრათ View binding კლასს გამოიყენოს არსებული განლაგება.

კოტლინი:

val binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */)

ჯავა:

SomeLayoutBinding binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */);

მაგალითად, თუ გინდოდათ Binding კლასის გამოყენება ფრაგმენტში, ის ასე გამოიყურება.

კოტლინი:

classSomeFragment : Fragment(R.layout.some_layout) {
//Lazy initialization means bind() won't be called until "binding" is referenced.
private val binding by lazy { SomeLayoutBinding.bind(view) }

override fun onViewCreated(view: View, savedInstanceState: Bundle?){
super.onViewCreated(view, savedInstanceState)

//Once this method is called, you can start using the binding.
}
}

ჯავა:

publicclassSomeFragmentextendsFragment{
private SomeLayoutBinding binding = null;

publicSomeFragment(){
super(R.layout.some_layout);
}

@Override
publicvoidonViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);

//Initialize the binding.
binding = SomeLayoutBinding.bind(view);
}
}

ინსტანცია ახალი ხედით

აკინძვის კლასს შეუძლია ასევე იზრუნოს თქვენთვის განლაგების გაბერვაზე.

კოტლინი:

val binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */)

ჯავა:

SomeLayoutBinding binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */);

ეს მეთოდი სასარგებლოა როგორც ფრაგმენტებში, ასევე აქტივობებში.

ან მაგალითი ფრაგმენტი შემდეგნაირად გამოიყურება.

კოტლინი:

classSomeFragment : Fragment() {
private val binding by lazy { SomeLayoutBinding.inflate(LayoutInflater.from(requireContext())) }

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?){
//The "root" of the binding class is the root of its layout.
return binding.root
}
}

ჯავა:

publicclassSomeFragmentextendsFragment{
private SomeLayoutBinding binding = null;

@Override
publicvoidonCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
//Initialize the binding.
binding = SomeLayoutBinding.inflate(inflater);
//The "getRoot()" method of the binding class returns the root of the layout.
return binding.getRoot();
}
}

ან მაგალითი აქტივობა შემდეგნაირად გამოიყურება.

კოტლინი:

classSomeActivity : AppCompatActivity() {
private val binding by lazy { SomeLayoutBinding.inflate(layoutInflater) }

override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)

//This is equivalent to calling "setContentView(R.layout.some_layout)" but allows use of the binding class.
setContentView(binding.root)
}
}

ჯავა:

publicclassSomeActivityextendsAppCompatActivity{
private SomeLayoutBinding binding = null;

@Override
protectedvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

//Instantiate the binding.
binding = SomeLayoutBinding.inflate(getLayoutInflater());
//This is equivalent to calling "setContentView(R.layout.some_layout)" but allows use of the binding class.
setContentView(binding.getRoot());
}
}

ნახვების მითითება

ახლა, როდესაც View binding კლასი დაყენებულია და მზად არის გამოსაყენებლად, დროა რეალურად გამოიყენოთ იგი.

ვთქვათ შინაარსი some_layout.xml არის რაღაც მსგავსი:

 android:
...>
android:
...
/>
android:
...
/>
android:
...>
android:
...
/>
LinearLayout>
LinearLayout>

არსებობს უამრავი პირადობის მოწმობა კოდში მითითებისთვის. მაგრამ სანამ თქვენ გაქვთ სავალდებულო კლასის ინსტანციირება, მითითება ადვილი იქნება.

Kotlin-ში ნახვები მითითებულია მათი ID-ების შესაბამისი ცვლადებით, გარკვეული ცვლილებებით. ხაზგასმული ხაზები ამოღებულია და მიღებული სიმი არის აქლემის გარსი. მაგალითად, მითითება some_frame_layout კოდიდან, ნეტავ გამოიყენო binding.someFrameLayout. The someFrameLayout ცვლადი იქნება FrameLayout-ის მაგალითი.

val someFrameLayout: FrameLayout = binding.someFrameLayout

Java-ში ნახვები მოიხსენიება მათი ID-ების შესაბამისი მიმღების მეთოდებით, კოტლინის მსგავსი ფორმატით. მაგალითად, მითითება some_frame_layoutნეტავ გამოიყენო binding.getSomeFrameLayout(). მეთოდი დააბრუნებს FrameLayout-ის მაგალითს.

FrameLayout someFrameLayout = binding.getSomeFrameLayout();

View მითითებები ასევე გაბრტყელებულია საკინძში. მითითება inner_imageview იგივეა, რაც მითითება some_frame_layout.

დასკვნა

როგორც დარწმუნებული ვარ, ხედავთ, View Binding-ში ანდროიდში არის მარტივი განსახორციელებელი და მარტივი გამოსაყენებელი. ხშირ შემთხვევაში, მისი გამოყენება უფრო ადვილია, ვიდრე findViewById().

View Binding-ის განხორციელების შესახებ დამატებითი ინფორმაციისთვის, რამდენიმე მაგალითთან ერთად, შეამოწმეთ Google-ის ოფიციალური დოკუმენტაცია.