ListPopupWindow动画从文本字段而不是其下方开始

问题描述

我在ListPopupWindow添加一个TextInputLayout。我的问题是弹出动画TextInputLayout内开始:

enter image description here

请注意,问题只是动画开始的地方。动画结束后,弹出窗口将正确显示TextInputLayout下面。

我该怎么做才能使动画在TextInputLayout下方开始?请注意,这不是我自己的动画,而是认的动画。

布局摘要

<com.google.android.material.textfield.TextInputLayout
    android:id="@+id/textInputLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginStart="16dp"
    android:layout_marginTop="16dp"
    android:layout_marginEnd="16dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="hint" />
</com.google.android.material.textfield.TextInputLayout>

ListPopupWindow代码

val arrAdapter = ArrayAdapter<String>(
        this,R.layout.dropdown_menu_popup_item,listof("hello","world")
)

val listPopupWindow = ListPopupWindow(this).apply {
    anchorView = findViewById(R.id.textInputLayout)
    setAdapter(arrAdapter)
}

findViewById<Button>(R.id.button).setonClickListener {
    listPopupWindow.show()
}

Github上也提供了代码https://github.com/wondering639/stack-listpopupwindow-animation-start

提示:这只是一个简化的测试用例。我知道AutoCompleteTextView,但是我确实需要手动显示ListPopupWindow

解决方法

您可以使用setEpicenterBounds(Rect)并将Rect宽度传递到全宽度,但在锚点的底部传递平坦的高度。

显然,在调用setEpicenterBounds(Rect)时,锚视图必须已被布局,因为它的大小是必需的,因此,调用的最佳位置可能就在show()之前,如果您确实无法做到这一点那里,并且锚点视图未使用固定大小,则可以使用ViewTreeObserver.OnGlobalLayoutListener

val anchorView = findViewById<View>(R.id.textInputLayout)
val listPopupWindow = ListPopupWindow(this).apply {       
    this.anchorView = anchorView
    setAdapter(arrAdapter)
}

findViewById<Button>(R.id.button).setOnClickListener {
    listPopupWindow.epicenterBounds = Rect(0,anchorView.height,anchorView.width,anchorView.height)
    listPopupWindow.show()
}

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...