Почему использование View Binding меняет макет? - PullRequest
1 голос
/ 09 мая 2020

Фактический код:

Моя основная деятельность:

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 файл:

<?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: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:layout_gravity="center_horizontal"
        android:text="@string/count"
        android:textSize="30sp" />

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

Предварительный просмотр в android studio:

Preview

Фактическая компоновка в устройстве:

actual layout

Если я изменю setContentView(binding.root) до setContentView(R.layout.activity_main), макет Android Studio и устройства становятся одинаковыми, но, естественно, кнопка больше не работает ...

Почему это происходит? Почему ActivityMainBinding.inflate(layoutInflater) меняет раскладку? Как это исправить?

Спасибо

Репозиторий GitHub: https://github.com/Wizard28082006/Dice_Roller

Ответы [ 2 ]

2 голосов
/ 10 мая 2020

Если я изменю setContentView (binding. root) на setContentView (R.layout.activity_main), макет Android Studio и устройство станут одинаковыми

Большинство Вероятно, это вызвано тем, что container не передается в надувной модуль, если вид расширен таким образом.

Вместо этого вы можете попробовать следующее:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root"

и

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

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        binding = ActivityMainBinding.bind(findViewById(R.id.root))

        val rollButton = binding.rollButton
        rollButton.setOnClickListener { rollDice() }
2 голосов
/ 09 мая 2020

Может быть, вам следует установить android: layout_height как match_parent в вашем linearlayout и выровнять в нем внутренние представления.

...