【问题标题】:Exposed Dropdown Menu not showing items暴露的下拉菜单不显示项目
【发布时间】:2021-05-03 16:23:36
【问题描述】:

Exposed Dropdown Menu 在用户选择和片段转换后不显示项目。

以下是基本的 xml 声明:

<com.google.android.material.textfield.TextInputLayout
    ...
    style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
 
         <AutoCompleteTextView
            .... 
            android:id="@+id/dropdown"
            android:dropDownHeight="300dp"
            android:inputType="none" />
</com.google.android.material.textfield.TextInputLayout>

并且,片段上声明的代码(在onViewCreated()内):

    val items = listOf("Material", "Design", "Components", "Android")
    val adapter = ArrayAdapter(requireContext(), R.layout.item_menu, items)
    dropdown.setAdapter(adapter)
    dropdown.setText(items[0], false)

here 所述,它在AutoCompleteTextView's setText 方法(dropdown.setText("", false))上将过滤器参数设置为false。但是,在导航到下一个片段并返回到该片段后,下拉列表中只会显示预先选择的文本。

使用navigation component(v.2.3.2)更改片段。

【问题讨论】:

  • 我遇到了同样的问题。

标签: android autocompletetextview material-components-android android-textinputlayout


【解决方案1】:

片段的视图在使用导航组件时被破坏。 (也许并不总是,但它肯定会在你经历的某些时候发生)

我认为您可能只需添加一个条件即可使其工作:

if (savedInstanceState == null) {
    dropdown.setText(items[0], false)
}

这样只有在恢复视图状态时才设置默认值。

否则这只是像往常一样保存状态的问题。如果您不确定我在说什么,这里有一个documentation article。它基本上相当于将以下代码添加到您的片段中:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    val item = savedInstanceState?.getInt("selectedPos", 0) ?: 0
    dropdown.setText(items[item], false)
}

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putInt("selectedPos", dropdown.getListSelection())
}

如果您使用 MVVM 架构,您可以在 ViewModel 中使用 SavedStateHandle 保存所选位置,当它发生更改时。

【讨论】:

  • 很遗憾,您的代码中显示的解决方案都不起作用。
  • 那我误解了你的问题。尽管如此,您必须适当地保存状态,因为导航组件会在它们被导航出时破坏片段,从而丢失视图状态。
【解决方案2】:

我遇到了同样的问题。我在 github 页面上搜索了问题。我发现这个https://github.com/material-components/material-components-android/issues/2012#issuecomment-808853621 现在可以解决了。它有效。

  1. 创建一个类似下面的扩展

    fun AutoCompleteTextView.showDropdown(adapter: ArrayAdapter<String>?) {
     if(!TextUtils.isEmpty(this.text.toString())){
         adapter?.filter?.filter(null)
     }
    }
    

然后点击下拉菜单

 binding.quaters.setOnClickListener {
            binding.quaters.showDropdown(arrayAdapter)
        }

这就是它应该工作的全部。这似乎是一个应该修复的错误。

【讨论】:

    猜你喜欢
    • 2020-07-22
    • 2021-09-08
    • 2020-02-22
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多