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() }