====== Android Bindings ======
ViewBindings és un mecanisme que facilita l'accés a les views des del codi de l'app Android.
Referències:
* [[https://developer.android.com/topic/libraries/view-binding|View Binding]].
* [[https://developer.android.com/topic/libraries/view-binding?hl=es-419|Vinculación de vista (en castellà)]].
{{tag> #Dam #DamMp08 #DamMp08Uf2 #DamMp08Uf02 #DamMp08Uf2 Android mobile java kotlin }}
\\
====== Objectiu i exemple ======
La idea dels //view bindings// és substituir les crides amb //dynamic cast// que poden retornar un valor erroni i resultar en excepcions tiupus ''NullPointerException'' o similars.
El què habitualment resoldríem amb un ''findViewById'':
val button = findViewById
Ara es resoldrà amb una crida directa a la jerarquia d'objectes de la //view//:
binding.button.setOnClickListener {
val toSpeak = binding.parlaText.text.toString()
tts.speak(toSpeak,TextToSpeech.QUEUE_FLUSH,null)
}
El compilador i l'IDE seran capaços de detectar errors mitjançant la inferència de tipus, facilitant la claredat i seguretat del codi.
\\
===== View Bindings en Activity =====
Per poder emprar els //view bindings// caldrà modificar els arxius:
* build.gradle.kts
* MainActivity.kt
android {
//...
buildFeatures {
viewBinding = true
}
//...
}
package com.usuari.lamevaapp
// ...
import com.usuari.lamevaapp.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
lateinit var binding : ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// ...
}
// ...
}
\\
===== View Bindings en Fragment =====
package com.usuari.lamevaapp
// ULL: si es posa TTS en majúscules no ho reconeix bé, ha de ser camel case
import com.usuari.lamevaapp.databinding.FragmentTtsBinding
class TTSFragment : Fragment() {
private var _binding: FragmentTtsBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
_binding = FragmentTtsBinding.inflate(inflater, container, false)
// ...
}
//...
}
\\