Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么使用视图绑定会改变布局?_Android_Android Layout_Kotlin_Android Viewbinding - Fatal编程技术网

Android 为什么使用视图绑定会改变布局?

Android 为什么使用视图绑定会改变布局?,android,android-layout,kotlin,android-viewbinding,Android,Android Layout,Kotlin,Android Viewbinding,实际代码: 我的主要活动: class MainActivity:AppCompatActivity(){ 私有lateinit变量绑定:ActivityMainBinding 重写创建时的乐趣(savedInstanceState:Bundle?){ super.onCreate(savedInstanceState) 绑定=活动主绑定。充气(更平) val rollButton=binding.rollButton rollButton.setOnClickListener{rollDice

实际代码:

我的主要活动:

class MainActivity:AppCompatActivity(){
私有lateinit变量绑定:ActivityMainBinding
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
绑定=活动主绑定。充气(更平)
val rollButton=binding.rollButton
rollButton.setOnClickListener{rollDice()}
setContentView(binding.root)
}
私人娱乐掷骰子(){
val randomDiceRoll=Random.nextInt(6)+1
Toast.makeText(this,randomDiceRoll.toString(),Toast.LENGTH\u SHORT.show())
binding.resultText.text=RandomDicRoll.toString()
}
我的XML文件:


在android studio中预览:

设备中的实际布局:

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

为什么会发生这种情况?为什么
ActivityMainBinding.flate(layoutInflater)
会更改布局?如何解决此问题

谢谢

GitHub回购:

也许您应该在线性布局中将android:layout\u height设置为match\u parent,并在其中对齐内部视图

如果我将setContentView(binding.root)更改为setContentView(R.layout.activity_main),Android Studio和设备的布局将变得相同

最有可能的原因是,如果视图是这样充气的,
容器
没有传递给充气机

您可以尝试以下方法:

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

由于屏幕截图显示问题来自b,因此b上有一个很好的解释(链接仅可供课程用户访问)。简而言之,解释是和中提到的两件事

首先,当使用
setContentView

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

ViewBinding
的缺点是

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


android:gravity
android:layout\u gravity
之间存在差异:

  • android:gravity
    设置查看内容的重力(如果它应用于
    查看组
    ,则为子级)
  • 同时,
    android:layout\u gravity
    设置应用它的视图相对于其父视图的重力


你对数据绑定和普通布局膨胀都使用了给定的xml布局吗?@sebi0920是的,我对这两种布局都使用了相同的xml布局。这是因为你的
布局高度
包装内容
而不是
匹配父项
@EpicPandaForce,但Android Studio中的预览显示它是居中的?这是因为之前的ew用一个居中的容器包装您的视图,但您的视图本身没有居中。从您让我做的更改中,我得到了一个答案,这一个在android studio和我的设备上看起来是一样的……但我使用了
android:gravity=“center\u vertical”
而不是“android:layou gravity=“center\u vertical”为了让它工作…你能解释为什么会发生这种情况吗?你能解释为什么茎没有通过吗?嗯,它从来没有通过,是吗?要找到它,你必须做
findViewById(Window.ID\u CONTENT
,但没有人真的这么做。
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() }