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

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?