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
相关产品推荐
相关产品推荐

