【问题标题】:Why viewBinding makes XML root full screen为什么 viewBinding 让 XML 根目录全屏
【发布时间】:2020-07-29 19:02:39
【问题描述】:

我想知道为什么在我的应用程序中添加viewBinding 会使运行应用程序时 XML 根目录全屏显示。在 Android Studio 的设计器视图中,根不会全屏显示。

由于根以全屏显示,我不得不添加android:gravity="center" 以垂直对齐中心的孩子。虽然我不认为这应该是个问题,但我仍然想知道为什么会这样。

我有以下代码;

<?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:orientation="vertical"
    android:gravity="center"
    android:layout_gravity="center_vertical"
    android:background="@color/colorAccent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="1"
        android:textSize="30sp" />

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

</LinearLayout>
package com.example.diceroller

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.diceroller.databinding.ActivityMainBinding

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

        binding.rollButton.text = "testBind"
        setContentView(binding.root)
    }
}

【问题讨论】:

    标签: android android-studio android-layout kotlin android-viewbinding


    【解决方案1】:

    我不确定,但我认为当您执行此setContentView(binding.root) 时,您将线性布局设置为全屏。

    setContentView Android Docs

    将活动内容设置为显式视图。此视图直接放置在活动的视图层次结构中。它本身可以是一个复杂的视图层次结构。调用此方法时,会忽略指定视图的布局参数。 视图的widthheight 默认设置为ViewGroup.LayoutParams#MATCH_PARENT。要使用您自己的布局参数,请改为调用 setContentView(android.view.View, android.view.ViewGroup.LayoutParams)

    要使它看起来像在预览中您可以编写此代码。 XML:

    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
    
        <data>
    
        </data>
    
    
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:background="@color/colorAccent"
                android:gravity="center"
                android:orientation="vertical"
                tools:context=".MainActivity">
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:text="1"
                    android:textSize="30sp" />
    
                <Button
                    android:id="@+id/roll_button"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:text="Roll" />
    
            </LinearLayout>
    
        </FrameLayout>
    
    </layout>
    

    MainActivity.kt:

    class MainActivity : AppCompatActivity() {
    
        private lateinit var binding: ActivityMainBinding
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            binding = ActivityMainBinding.inflate(layoutInflater)
    
            binding.rollButton.text = "Test Roll"
            setContentView(binding.root)
        }
    }
    

    提示:要快速将您的布局转换为数据绑定布局,请使用:Alt + EnterConvert to data binding layout

    【讨论】:

    • 感谢您的回答!我很感激。虽然我还有一些问题和疑问。 1. 你知道为什么 setContentView 会忽略布局参数吗? 2. 我使用viewBinding,所以转换布局的快捷方式不可用。 3. 当我自己编辑布局时,出现以下错误(我敢打赌这是由于使用 viewBinding 而不是 dataBinding); Cannot access 'no_name_in_PSI_3d19d79d_1ba9_4cd0_b7f5_b46aa3cd5d40' which is a supertype of 'com.example.diceroller.databinding.ActivityMainBinding'. Check your module classpath for missing or conflicting dependencies
    • 哦,我没注意到您使用的是 ViewBinding,而不是 DataBinding。但我认为只有一个参数的setContentView 会忽略视图布局参数,因为这正是这个函数的工作原理:When calling this method, the layout parameters of the specified view are ignored.。如果您想使用您的参数,您必须将其添加为第二个参数。但我认为您的布局将放置在屏幕顶部而不是中心。
    猜你喜欢
    • 2023-03-11
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2020-02-29
    • 2022-01-01
    • 2017-06-01
    • 2021-08-03
    相关资源
    最近更新 更多