Kuidas lisada Android Gradle'i projektile View Binding

View Binding muudab vaadetega suhtleva koodi kirjutamise lihtsamaks. Siit saate teada, kuidas seda oma Android Gradle'i projektis seadistada.

Enamik Androidi arendajaid on ilmselt klassikaga tuttavad findViewById() meetod. Edastage sellele oma XML-paigutuse ühe vaate ID ja see tagastab viite selle vaate suurendatud versioonile. See on kõik eeldusel, et edastasite õige ID ja vaade on tegelikult olemas. findViewById() ei ole sisseehitatud kontrolle, mis takistaksid teil püüda tuua vaadet, mida te ei saa tuua. Sisestage View Binding.

Kasutamise asemel findViewById() iga soovitud vaate puhul loob View Binding automaatselt iga paigutuse XML-i jaoks sidumisklassi. Iga ID-ga vaade lisatakse klassi automaatselt, nii et saate neile otse viidata.

View Bindingi lisamine Android Gradle'i projektile on ülilihtne.

Gradle'i seadistamine

Vaate sidumine on Gradle'is lubatud mooduli tasemel. Kui teil on mitu moodulit, peate selle igaühe jaoks eraldi lubama.

Aastal android blokeerida oma mooduli tasemel build.gradle, lisage vaate sidumise lubamise valik.

android {
...

buildFeatures {
viewBinding true
}
}

Ebaseadusliku juurdepääsu kohta võib olla hoiatus, kuid see on ebeme viga ja seda võib ohutult ignoreerida.

Sünkroonige projekt ja View Binding lubatakse. Nii lihtne see ongi.

Vaate sidumise kasutamine

Vaate sidumise kasutamiseks on mitu võimalust, kuid enne, kui see juhtub, räägime sellest, kuidas sidumisklassid genereeritakse.

Klassi nime süntaks

Oletame, et teil on XML-i paigutus some_layout.xml. Sellele vastav sidumisklass nimetatakse SomeLayoutBinding. See muster kehtib kõigi failide kohta.

Iga sõna (mis on failinimes alakriipsudega eraldatud) kirjutatakse suurtähtedega ja alakriipsud eemaldatakse. Seejärel lisatakse lõppu "Sidumine".

Instantseerimine olemasoleva vaatega

Kui olete paigutusfaili juba paisutanud ja teil on viide paigutuse juurele, saate käskida sidumisklassil View kasutada olemasolevat paigutust.

Kotlin:

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

Java:

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

Näiteks kui soovite kasutada fragmendis sidumisklassi, näeks see välja umbes selline.

Kotlin:

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

Instantseerimine uue vaatega

Köitmisklass võib teie eest hoolitseda ka paigutuse paisutamise eest.

Kotlin:

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

Java:

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

See meetod on kasulik nii fragmentide kui ka tegevuste puhul.

An näide Fragment näeks välja umbes selline.

Kotlin:

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 näide Tegevus näeks välja umbes selline.

Kotlin:

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

Vaadetele viitamine

Nüüd, kui sidumisklass View on seadistatud ja kasutamiseks valmis, on aeg seda reaalselt kasutada.

Ütleme, et sisu some_layout.xml on midagi sellist:

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

Seal on palju ID-sid, millele koodis viidata. Kuid seni, kuni teil on sidumisklass instantseeritud, on viitamine lihtne.

Kotlinis viitavad vaadetele muutujad, mis vastavad nende ID-dele, mõningate muudatustega. Alakriipsud eemaldatakse ja saadud string on kaameliümbrisega. Näiteks viitamiseks some_frame_layout koodist, te kasutaksite binding.someFrameLayout. The someFrameLayout muutuja on FrameLayouti eksemplar.

val someFrameLayout: FrameLayout = binding.someFrameLayout

Javas viitavad vaadetele getterimeetodid, mis vastavad nende ID-dele ja mille vorming on sarnane Kotliniga. Näiteks viitamiseks some_frame_layout, te kasutaksite binding.getSomeFrameLayout(). Meetod tagastab FrameLayouti eksemplari.

FrameLayout someFrameLayout = binding.getSomeFrameLayout();

Vaatamise viited on köites samuti tasandatud. Viitamine inner_imageview on sama mis viitamine some_frame_layout.

Järeldus

Nagu kindlasti näete, on Androidis View Binding nii lihtne rakendada kui ka kasutada. Paljudel juhtudel on seda lihtsam kasutada kui findViewById().

Vaate sidumise juurutamise kohta lisateabe saamiseks koos mõne näitega vaadake Google'i ametlikku dokumentatsiooni.