You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android电商应用字符串数组显示异常:部分选项空白点击后恢复正常

解决AutoCompleteTextView中品牌列表部分项显示空白但点击正常的问题

问题场景

开发电商应用时,将品牌列表存储在strings.xml及strings.xml(ar-rEG)的string-array中,通过ArrayAdapter绑定到AutoCompleteTextView后,出现部分列表项显示空白的情况,但点击空白选项时能正常获取并显示对应品牌值。

核心代码参考

多语言字符串数组(strings.xml/ar-rEG)

<string-array name="brand_list">
    <item>الكل</item>
    <item>212</item>
    <item>Acm</item>
    <item>Anivagene</item>
    <!-- 其余品牌项 -->
</string-array>

Fragment中适配器绑定代码

private lateinit var brandAdapter: ArrayAdapter<String>

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    // 其他初始化代码
    brandAdapterImpl()
    // 其他代码
}

private fun brandAdapterImpl() {
    brandAdapter = ArrayAdapter(
        requireActivity(),
        android.R.layout.simple_list_item_1,
        resources.getStringArray(R.array.brand_list)
    )
    binding.autoCompleteBrand.run {
        setAdapter(brandAdapter)
        viewModel.selectedBrandPosition.observe(viewLifecycleOwner) {
            setText(brandAdapter.getItem(it), false)
            isSaveEnabled = false
            freezesText = false
        }
    }
    binding.autoCompleteBrand.setOnItemClickListener { _, _, position, _ ->
        val brand = brandAdapter.getItem(position)
        viewModel.saveSelectedBrand(brand!!, position)
        viewModel.filterProducts()
    }
}

解决方案

1. 解决RTL文本与默认布局的对齐冲突

系统默认的android.R.layout.simple_list_item_1是左对齐布局,阿拉伯语属于RTL(从右到左)语言,可能导致文本被挤出可视区域,看起来显示空白。

  • 自定义列表项布局res/layout/item_brand_list.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:textSize="16sp"
    android:layoutDirection="locale" />
  • 替换适配器中的布局引用:
brandAdapter = ArrayAdapter(
    requireActivity(),
    R.layout.item_brand_list, // 使用自定义布局
    resources.getStringArray(R.array.brand_list)
)

2. 排查字符编码/不可见字符问题

部分品牌项可能在复制粘贴时引入了不可见控制字符,导致显示异常:

  • 用支持显示控制字符的文本编辑器打开strings.xml文件,检查所有品牌项是否包含特殊字符
  • 手动重新输入显示空白的品牌名称,避免直接复制粘贴

3. 自定义适配器强制文本渲染

系统默认ArrayAdapter处理混合语言文本时可能出现渲染异常,自定义适配器强制绑定文本并适配RTL:

class BrandAdapter(context: Context, private val brands: Array<String>) :
    ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, brands) {
    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val view = super.getView(position, convertView, parent)
        val textView = view.findViewById<TextView>(android.R.id.text1)
        textView.text = brands[position]
        // 根据系统语言方向调整对齐方式
        if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) == View.LAYOUT_DIRECTION_RTL) {
            textView.gravity = Gravity.END
        } else {
            textView.gravity = Gravity.START
        }
        return view
    }
}
  • 替换原适配器:
brandAdapter = BrandAdapter(requireActivity(), resources.getStringArray(R.array.brand_list))

4. 调整AutoCompleteTextView布局属性

在布局文件中给AutoCompleteTextView添加以下属性,避免输入类型或布局方向冲突:

android:inputType="textNoSuggestions"
android:layoutDirection="locale"

内容的提问来源于stack exchange,提问作者Mahmoud Reda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:23:22