如何解决ListPopupWindow动画从文本字段而不是其下方开始
我在ListPopupWindow
上添加了一个TextInputLayout
。我的问题是弹出动画在TextInputLayout
内开始:
请注意,问题只是动画开始的地方。动画结束后,弹出窗口将正确显示在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()
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。