暴露的下拉菜单不显示项目

Posted

技术标签:

【中文标题】暴露的下拉菜单不显示项目【英文标题】: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)更改片段。

【问题讨论】:

我遇到了同样的问题。 【参考方案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 现在可以解决了。它有效。

    创建一个类似下面的扩展

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

然后点击下拉菜单

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

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

【讨论】:

以上是关于暴露的下拉菜单不显示项目的主要内容,如果未能解决你的问题,请参考以下文章

子菜单不在WordPress下拉菜单中复制样式

语义 ui 滚动下拉列表不显示所选项目

第一个下拉菜单更改第二个下拉菜单相关项目显示

Drupal 视图和暴露的过滤器下拉菜单

iOS仿微信、支付宝首页下拉菜单选择视图

未调用材质暴露下拉菜单 OnItemSelectedListener