Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.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
Java ConstraintLayout中消失的元素会留下重影空间_Java_Android_Android Layout_Android Constraintlayout_Android Viewholder - Fatal编程技术网

Java ConstraintLayout中消失的元素会留下重影空间

Java ConstraintLayout中消失的元素会留下重影空间,java,android,android-layout,android-constraintlayout,android-viewholder,Java,Android,Android Layout,Android Constraintlayout,Android Viewholder,因此,我有一个RecycleView的布局文件,它具有可展开/可折叠的视图保持架 单击标题将展开/折叠额外的数据。在编辑器中一切看起来都很好。但是,它会有一个类似于layout\u marginBottom的重影空间 首次加载的外观 扩展 正确折叠 因此编辑器将只显示ViewHolder,如图2和图3所示。 然而,当在设备上运行时,它将首先显示图1,然后单击它展开后,它将显示图2。再次折叠它将显示图3而不是图1。它将继续显示正确的数字(2和3) 图2中的额外内容与标题有共同的父项,标题是C

因此,我有一个
RecycleView
的布局文件,它具有可展开/可折叠的视图保持架

单击标题将展开/折叠额外的数据。在编辑器中一切看起来都很好。但是,它会有一个类似于
layout\u marginBottom
的重影空间

首次加载的外观

扩展

正确折叠

因此编辑器将只显示
ViewHolder
,如图2和图3所示。 然而,当在设备上运行时,它将首先显示图1,然后单击它展开后,它将显示图2。再次折叠它将显示图3而不是图1。它将继续显示正确的数字(2和3)

图2中的额外内容与标题有共同的父项,标题是
ConstraintLayout

无论
说明符是以编程方式还是XML方式,都会发生这种情况
使用activity.runOnUIThread
没有帮助。使用
new Handler().onPostDelayed
只会更糟糕,如图1所示,但会有更多不需要的空间,如图2所示,只是没有额外的信息

以下是XML文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
app:cardCornerRadius="10dp">

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <LinearLayout
        android:id="@+id/header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:padding="10dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/validity"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0">

        <ImageButton
            android:id="@+id/expand"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/transparent"
            android:layout_marginRight="8dp"
            android:layout_marginEnd="8dp"
            app:srcCompat="@drawable/ic_right" />

        <TextView
            android:id="@+id/title"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ellipsize="end"
            android:maxLines="1"
            android:textColor="@color/textDark" />
    </LinearLayout>

    <View
        android:id="@+id/divider"
        android:layout_width="0dp"
        android:layout_height="2dp"
        android:layout_marginEnd="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginStart="16dp"
        android:background="@color/colorSecondaryDark"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/header" />

    <TextView
        android:id="@+id/date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="8dp"
        android:layout_marginStart="10dp"
        android:layout_marginTop="8dp"
        app:layout_constraintEnd_toStartOf="@+id/size"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/divider" />

    <TextView
        android:id="@+id/size"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginTop="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/divider" />

    <TextView
        android:id="@+id/amount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="8dp"
        android:layout_marginStart="10dp"
        android:layout_marginTop="8dp"
        app:layout_constraintEnd_toStartOf="@+id/validity"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/date" />

    <LinearLayout
        android:id="@+id/validity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginTop="8dp"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/size">

        <ImageView
            android:id="@+id/help"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="8dp"
            android:layout_marginRight="8dp"
            android:layout_weight="1"
            android:contentDescription="@string/backup_layout_help_desc"
            app:srcCompat="@drawable/ic_help" />

        <TextView
            android:id="@+id/invalid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/backup_layout_invalid"
            android:textAllCaps="true"
            android:textColor="@color/red" />
    </LinearLayout>

    <TextView
        android:id="@+id/passwords"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="10dp"
        android:layout_marginStart="10dp"
        android:layout_marginTop="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/amount" />

    <Button
        android:id="@+id/delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="8dp"
        android:layout_marginStart="10dp"
        android:layout_marginTop="10dp"
        android:background="@android:color/transparent"
        android:text="@string/backup_layout_delete"
        android:textColor="@color/red"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/importshare"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/passwords"
        app:layout_constraintVertical_bias="1.0" />

    <LinearLayout
        android:id="@+id/importshare"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="10dp"
        android:orientation="horizontal"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/validity"
        app:layout_constraintVertical_bias="1.0">

        <Button
            android:id="@+id/commit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@android:color/transparent"
            android:text="Import"
            android:textColor="@color/yellow" />

        <ImageButton
            android:id="@+id/share"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@android:color/transparent"
            android:contentDescription="Share"
            android:padding="10dp"
            app:srcCompat="@drawable/ic_share" />
    </LinearLayout>

</android.support.constraint.ConstraintLayout>
科特林

当我试图在键盘打开时隐藏元素时,我遇到了一个非常类似的问题

当您打开键盘时,会发生两次大小调整,一次调整开口和键盘,另一次调整将视图设置为消失。问题是,第二次调整只会在另一个元素请求布局时发生,因此您的屏幕会明显地跳转两次

  • 当键盘打开时
  • 当您点击或移动另一个UI元素时
  • 我已经找到了一个解决方案,但只有当窗口软输入模式=调整大小

    见下文

    class MainActivity : AppCompatActivity() {
        private var activityHeight = 0
        private var keyboardOpen = false
        private var mainScreen : ConstraintLayout? = null
        private var infoText : TextView? = null
        
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.main_screen)
    
            mainScreen = findViewById(R.id.mainConstraintLayout)
            infoText = findViewById(R.id.mainInfoText)
    
            //...
    
            /* Capture initial screen size */
            this@MainActivity.window.decorView.doOnNextLayout {
                val displayFrame : Rect = Rect()
                this@MainActivity.window.decorView.getWindowVisibleDisplayFrame(displayFrame)
                activityHeight = displayFrame.height()
            }
    
            /* Check for keyboard open/close */
            this@MainActivity.window.decorView.addOnLayoutChangeListener { v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom ->
                val drawFrame : Rect = Rect()
                this@MainActivity.window.decorView.getWindowVisibleDisplayFrame(drawFrame)
                val currentSize = drawFrame.height()
                if(keyboardOpen){
                    keyboardOpen = currentSize < activityHeight
                    if (!keyboardOpen){
                        infoText?.visibility = View.VISIBLE
                    }
                }else {
                    keyboardOpen = currentSize < activityHeight
                    if(keyboardOpen) {
                        infoText?.visibility = View.GONE
                        /* Request a new layout on your base layout so screen adjusts correctly */
                        mainScreen?.requestLayout()
                    }
                }
            }
        }
    }
    
    class MainActivity:AppCompatActivity(){
    私有变量activityHeight=0
    私有var键盘打开=错误
    私有变量主屏幕:ConstraintLayout?=null
    私有变量infoText:TextView?=null
    重写创建时的乐趣(savedInstanceState:Bundle?){
    super.onCreate(savedInstanceState)
    setContentView(右布局主屏幕)
    mainScreen=findViewById(R.id.mainConstraintLayout)
    infoText=findViewById(R.id.mainInfoText)
    //...
    /*捕获初始屏幕大小*/
    this@MainActivity.window.decorView.doOnNextLayout {
    val displayFrame:Rect=Rect()
    this@MainActivity.window.decorView.getWindowVisibleDisplayFrame(显示框)
    activityHeight=displayFrame.height()
    }
    /*检查键盘是否打开/关闭*/
    this@MainActivity.window.decorView.addOnLayoutChangeListener{v,左,上,右,下,左,左,右,右->
    val drawFrame:Rect=Rect()
    this@MainActivity.window.decorView.getWindowVisibleDisplayFrame(牵引架)
    val currentSize=drawFrame.height()
    如果(键盘打开){
    键盘打开=当前大小<活动高度
    如果(!键盘打开){
    infoText?.visibility=View.visibility
    }
    }否则{
    键盘打开=当前大小<活动高度
    如果(键盘打开){
    infoText?.visibility=View.GONE
    /*在基本布局上请求新布局,以便屏幕正确调整*/
    主屏幕?.requestLayout()
    }
    }
    }
    }
    }
    
    如果ConstraintLayout的目的是消除嵌套,为什么要有嵌套的LinearLayout?页眉需要LinearLayout,但是其他的,既然你说没有必要了。我只是不知道如何在ConstraintLayouts.using constraints and chains中水平居中。我看不出代码,但我打赌如果您为所有视图临时设置不同的背景色(不是白色),您将看到哪个视图占用了该空间。结果显示两个视图显示为不可见,尽管它被指定为
    已消失
    。不知道为什么,但在修改了适配器以从不将其设置为
    不可见
    不可见
    后,一切都变好了。顺便说一句,这两个视图分别是
    TextView
    ImageView
    class MainActivity : AppCompatActivity() {
        private var activityHeight = 0
        private var keyboardOpen = false
        private var mainScreen : ConstraintLayout? = null
        private var infoText : TextView? = null
        
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.main_screen)
    
            mainScreen = findViewById(R.id.mainConstraintLayout)
            infoText = findViewById(R.id.mainInfoText)
    
            //...
    
            /* Capture initial screen size */
            this@MainActivity.window.decorView.doOnNextLayout {
                val displayFrame : Rect = Rect()
                this@MainActivity.window.decorView.getWindowVisibleDisplayFrame(displayFrame)
                activityHeight = displayFrame.height()
            }
    
            /* Check for keyboard open/close */
            this@MainActivity.window.decorView.addOnLayoutChangeListener { v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom ->
                val drawFrame : Rect = Rect()
                this@MainActivity.window.decorView.getWindowVisibleDisplayFrame(drawFrame)
                val currentSize = drawFrame.height()
                if(keyboardOpen){
                    keyboardOpen = currentSize < activityHeight
                    if (!keyboardOpen){
                        infoText?.visibility = View.VISIBLE
                    }
                }else {
                    keyboardOpen = currentSize < activityHeight
                    if(keyboardOpen) {
                        infoText?.visibility = View.GONE
                        /* Request a new layout on your base layout so screen adjusts correctly */
                        mainScreen?.requestLayout()
                    }
                }
            }
        }
    }