Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] View Binging alterando o layout

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)

        val rollButton = binding.rollButton
        rollButton.setOnClickListener { rollDice() }

        setContentView(binding.root)
    }

    private fun rollDice() {
        val randomDiceRoll = Random.nextInt(6) + 1
        Toast.makeText(this, randomDiceRoll.toString(), Toast.LENGTH_SHORT).show()
        binding.resultText.text = randomDiceRoll.toString()
    }

XML do Layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/result_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/diceface1"
        android:layout_gravity="center_horizontal"/>

    <Button
        android:id="@+id/roll_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/roll"/>

</LinearLayout>

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidadePessoal, estou alterando um código que antes utilizava o findViewById para um com o view binding. Porém, notei o seguinte comportamento: Quando eu uso o setContentView(binding.root), as views que costumavam ficar centralizadas na tela (assim como é apresentado no preview do layout) com o método anterior (setContentView(R.layout.activity_main)) , vão todos para o topo, como é exibido no device. Como faço para resover isso? A minha dúvida é igual à esta: https://stackoverflow.com/questions/61695769/why-using-view-binding-is-changing-the-layout, porém, a única solução que passaram que funcionou pra mim, ainda sim utiliza o setContentView(R.layout.activity_main) para inflar a view e é passado um id para o LinearLayout para cham=alo no método bind(). Ex.: binding = ActivityMainBinding.bind(findViewById(R.id.root))

2 respostas
solução!

Olá Daniel, tudo bem ?

Por uma questão de atributos do XML algumas coisas podem não funcionar do mesmo jeito em ambas as formas (viewBinding e findViewById), como por exemplo, este caso que você nos trouxe, na própria documentação do android sobre [viewBinding](https://developer.android.com/topic/libraries/view-binding) encontramos essa frase:

"Na maioria dos casos, a vinculação de visualizações substitui findViewById."

Ou seja, em alguns casos você vai precisar adaptar seu layout, uma das soluções para seu problema seria você alterar a altura do seu LinearLayout para match_parent e colocar o atributo gravity ao invés do layout_gravity, isso por conta de que o atributo gravity se adapta a View e ViewGroup que está inserido e também ao seus conteúdos, já o layout_gravity é aplicado somente a própria View e ao seu parent que no caso do LinearLayout seria a própria tela do dispositivo. Fica aqui um exemplo de uma das possíveis soluções para seu XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/result_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/diceface1" />

    <Button
        android:id="@+id/roll_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/roll""/>

</LinearLayout>

Neste código realizei algumas alterações pontuais como por exemplo, alterar a altura para match_parent no LinearLayout para assim poder alcançar a tela inteira do seu dispositivo, coloquei também o atributo android:gravity="center" ao invés do layout_gravity pelo motivo que citei acima, O valor center é a junção do center_horizontal com o center_vertical e por último retirei os atributos de gravidade do texto e do botão pois já não são mais necessários com essas alterações.

Fico à disposição para quaisquer dúvidas.

Grande abraço e bons estudos!!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Muito obrigado Matheus, com sua explicação eu consegui entender e reproduzir com sucesso aqui!