Taula de continguts

Android Bindings

ViewBindings és un mecanisme que facilita l'accés a les views des del codi de l'app Android.

Referències:

, , , , , , , ,


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


View Bindings en Activity

Per poder emprar els view bindings caldrà modificar els arxius:

build.gradle.kts
android {
    //...
    buildFeatures {
        viewBinding = true
    }
    //...
}
MainActivity.kt
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

TTSFragment.kt
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)
 
        // ...
    }
 
    //...
}