Kā Android Gradle projektam pievienot View Binding

Skatu saistīšana atvieglo koda rakstīšanu, kas mijiedarbojas ar skatiem. Lūk, kā to iestatīt savā Android Gradle projektā.

Lielākā daļa Android izstrādātāju, iespējams, ir pazīstami ar klasiku findViewById() metodi. Nosūtiet tam viena skata ID savā XML izkārtojumā, un tas atgriezīs atsauci uz šī skata palielināto versiju. Tas viss, pieņemot, ka esat nokārtojis pareizo ID un ka skats patiešām pastāv. findViewById() nav iebūvētas pārbaudes, kas neļautu jums mēģināt izgūt skatu, kuru nevarat izgūt. Ievadiet View Binding.

Tā vietā, lai izmantotu findViewById() katrā vēlamajā skatā View Binding automātiski ģenerē saistīšanas klasi katram izkārtojuma XML. Katrs skats ar ID tiek automātiski pievienots klasei, lai jūs varētu tieši atsaukties uz tiem.

View Binding pievienošana Android Gradle projektam ir ļoti vienkārša.

Gradle iestatīšana

Skatu saistīšana programmā Gradle ir iespējota moduļa līmenī. Ja jums ir vairāki moduļi, tie jāiespējo katram atsevišķi.

Iekš android bloku savā moduļa līmenī build.gradle, pievienojiet opciju, lai iespējotu View Binding.

android {
...

buildFeatures {
viewBinding true
}
}

Var būt brīdinājums par nelegālu piekļuvi, taču tā ir savārstījuma kļūda, un to var droši ignorēt.

Sinhronizējiet projektu, un tiks iespējota skata saistīšana. Tas ir tik vienkārši.

Skata saistīšanas izmantošana

Ir daži veidi, kā izmantot View Binding, taču, pirms tas notiek, parunāsim par to, kā tiek ģenerētas saistošās klases.

Klases nosaukuma sintakse

Pieņemsim, ka jums ir XML izkārtojuma nosaukums some_layout.xml. Tā atbilstošā iesiešanas klase tiks nosaukta SomeLayoutBinding. Šis modelis attiecas uz visiem failiem.

Katrs vārds (atdalīts ar pasvītrojumu faila nosaukumā) tiks rakstīts ar lielo burtu, un pasvītras tiks noņemtas. Pēc tam "iesiešana" tiek pievienota beigām.

Momentāru izveide, izmantojot esošo skatu

Ja esat jau palielinājis izkārtojuma failu un jums ir atsauce uz izkārtojuma sakni, varat norādīt saistīšanas klasei View izmantot esošo izkārtojumu.

Kotlins:

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

Java:

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

Piemēram, ja vēlaties fragmentā izmantot saistīšanas klasi, tas izskatītos apmēram šādi.

Kotlins:

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.
}
}

Java:

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);
}
}

Momentāru izveide, izmantojot jauno skatu

Iesiešanas klase var arī parūpēties par izkārtojuma uzpūšanu jūsu vietā.

Kotlins:

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

Java:

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

Šī metode ir noderīga gan fragmentos, gan aktivitātēs.

An piemērs Fragments izskatītos šādi.

Kotlins:

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

Java:

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();
}
}

An piemērs Darbība izskatītos šādi.

Kotlins:

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)
}
}

Java:

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());
}
}

Atsauces uz skatiem

Tagad, kad View iesiešanas klase ir iestatīta un gatava lietošanai, ir pienācis laiks to faktiski izmantot.

Pieņemsim, ka saturs some_layout.xml ir kaut kas līdzīgs šādiem:

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

Kodā ir daudz ID, uz kuriem var atsaukties. Bet, ja vien jums ir iesiešanas klase, atsauce būs vienkārša.

Kotlinā uz skatiem atsaucas mainīgie, kas atbilst to ID, ar dažām izmaiņām. Pasvītras tiek noņemtas, un iegūtā virkne ir kamieļa apvalkā. Piemēram, uz atsauci some_frame_layout no koda, jūs izmantotu binding.someFrameLayout. The someFrameLayout mainīgais būs FrameLayout gadījums.

val someFrameLayout: FrameLayout = binding.someFrameLayout

Programmā Java uz skatiem atsaucas, izmantojot getter metodes, kas atbilst to ID, ar līdzīgu formātu kā Kotlin. Piemēram, uz atsauci some_frame_layout, jūs izmantotu binding.getSomeFrameLayout(). Metode atgriezīs FrameLayout gadījumu.

FrameLayout someFrameLayout = binding.getSomeFrameLayout();

Skata atsauces ir arī saplacinātas iesējumā. Atsauces inner_imageview ir tas pats, kas atsauces some_frame_layout.

Secinājums

Kā esmu pārliecināts, redzat, View Binding operētājsistēmā Android ir gan viegli ieviešams, gan ērti lietojams. Daudzos gadījumos to ir vieglāk izmantot nekā findViewById().

Lai iegūtu plašāku informāciju par skata saistīšanas ieviešanu, kā arī dažus piemērus, skatiet Google oficiālo dokumentāciju.