Везивање погледа олакшава писање кода који је у интеракцији са погледима. Ево како да га подесите у свом Андроид Градле пројекту.
Већина Андроид програмера је вероватно упозната са класиком findViewById()
методом. Проследите му ИД једног од приказа у вашем КСМЛ изгледу и он ће вратити референцу на надувану верзију тог приказа. То је све под претпоставком да сте пренели прави ИД и да Виев заиста постоји. findViewById()
нема уграђене провере које би вас спречиле да покушате да преузмете приказ који не можете да преузмете. Унесите Везивање погледа.
Уместо коришћења findViewById()
на сваком приказу који желите, Виев Биндинг аутоматски генерише класу повезивања за сваки КСМЛ распоред. Сваки приказ са ИД-ом се аутоматски додаје у класу, тако да можете директно да их референцирате.
Додавање везивања погледа у Андроид Градле пројекат је супер једноставно.
Градле Сетуп
Везивање погледа је омогућено на нивоу модула у Градле-у. Ако имате више модула, мораћете да га омогућите појединачно за сваки од њих.
У android
блок на нивоу вашег модула build.gradle
, додајте опцију за омогућавање везивања погледа.
android {
...
buildFeatures {
viewBinding true
}
}
Можда постоји упозорење о илегалном приступу, али то је грешка за влакна и може се безбедно занемарити.
Синхронизујте пројекат и Везивање приказа ће бити омогућено. То је тако лако.
Коришћење везивања погледа
Постоји неколико начина да се користи Виев Биндинг, али пре него што се било шта од тога догоди, хајде да разговарамо о томе како се генеришу класе везивања.
Синтакса имена класе
Рецимо да имате КСМЛ распоред под називом some_layout.xml
. Њена одговарајућа класа везивања ће бити именована SomeLayoutBinding
. Тај образац важи за све датотеке.
Свака реч (одвојена доњом цртом у називу датотеке) биће написана великим словима, а доње црте ће бити уклоњене. „Везивање“ се затим додаје на крај.
Инстанцирање са постојећим приказом
Ако сте већ надували датотеку изгледа и имате референцу на корен распореда, можете рећи класи повезивања Виев да користи постојећи распоред.
Котлин:
val binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */)
Јава:
SomeLayoutBinding binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */);
На пример, ако желите да користите класу повезивања у Фрагменту, то би изгледало отприлике овако.
Котлин:
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());
}
}
Референтни погледи
Сада када је класа повезивања Виев подешена и спремна за употребу, време је да је заиста користите.
Рецимо садржај some_layout.xml
су нешто попут следећег:
android:
...>
android:
...
/>
android:
...
/>
android:
...>
android:
...
/>
LinearLayout>
LinearLayout>
Постоји много ИД-ова за референцу у коду. Али све док имате инстанцирану класу везивања, референцирање ће бити лако.
У Котлину, на погледе се позивају променљиве које одговарају њиховим ИД-овима, уз неке измене. Доње црте се уклањају и резултујући низ је у облику слова камила. На пример, за референцу some_frame_layout
из кода, користили бисте binding.someFrameLayout
. Тхе someFrameLayout
променљива ће бити инстанца ФрамеЛаиоут-а.
val someFrameLayout: FrameLayout = binding.someFrameLayout
У Јави, погледи су референцирани помоћу геттер метода које одговарају њиховим ИД-овима, са сличним форматом као и Котлин. На пример, за референцу some_frame_layout
, користио би binding.getSomeFrameLayout()
. Метод ће вратити инстанцу ФрамеЛаиоут-а.
FrameLayout someFrameLayout = binding.getSomeFrameLayout();
Референце Виев су такође спљоштене у повезу. Референца inner_imageview
је исто што и референцирање some_frame_layout
.
Закључак
Као што сам сигуран да видите, Виев Биндинг у Андроиду је и лак за имплементацију и за коришћење. У многим случајевима, лакше је користити него findViewById()
.
За више детаља о примени везивања погледа, заједно са неким примерима, погледајте Гоогле-ову званичну документацију.