5

实际代码:

我的主要活动:

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 中预览:

预习

设备中的实际布局:

实际布局

如果我更改setContentView(binding.root)setContentView(R.layout.activity_main),Android Studio 和设备的布局变得相同,但当然,按钮不再起作用了......

为什么会这样?为什么要ActivityMainBinding.inflate(layoutInflater)改变布局?如何解决这个问题?

谢谢

GitHub 回购: https ://github.com/Wizard28082006/Dice_Roller

4

5 回答 5

3

也许您应该在您的线性布局中将 android:layout_height 设置为 match_parent 并在其中对齐内部视图。

于 2020-05-09T16:05:28.787 回答
3

如果我将 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() }
于 2020-05-10T05:13:48.877 回答
2

android:gravity和之间有区别android:layout_gravity

  • android:gravity设置View Content的重力(或孩子,如果它被应用在 a 上ViewGroup)。
  • 同时设置它所应用的View相对于其 parentandroid:layout_gravity的重力。
<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:orientation="vertical"
    android:gravity="center_vertical"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="1"
        android:layout_gravity="center_horizontal"
        android:textSize="30sp"/>
</LinearLayout>
于 2021-02-19T20:04:13.660 回答
1

由于屏幕截图表明问题来自Andorid 上的 Udacity 课程,因此对课程知识中心有很好的解释(链接仅供课程用户访问)。简而言之,解释是docsdocs中提到setContentView两件事。ViewBinding

首先是当setContentView使用

指定视图的布局参数被忽略

的缺点ViewBinding

它不支持布局变量或布局表达式,因此不能用于直接从 XML 布局文件声明动态 UI 内容

于 2020-12-15T13:58:13.700 回答
0

添加android:gravity = "center"到 LinearLayout 解决了这个问题。

于 2022-01-26T05:48:17.527 回答