ViewBindings és un mecanisme que facilita l'accés a les views des del codi de l'app Android.
Referències:
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<Button>(R.id.button) button.setOnClickListener { val toSpeak = binding.parlaText.text.toString() tts.speak(toSpeak,TextToSpeech.QUEUE_FLUSH,null) }
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.
Per poder emprar els view bindings caldrà modificar els arxius:
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) // ... } // ... }
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) // ... } //... }