关于Android中R.layout与R.array的技术疑问求助
以下是填充Spinner下拉菜单的代码:
adapter = ArrayAdapter.createFromResource(this, R.array.countries, androidx.appcompat.R.layout.support_simple_spinner_dropdown_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_item); spinnerCountry.setAdapter(adapter);
我的疑问:
- 存放在
res/values/strings.xml中的名为"countries"的字符串数组,为何必须使用R.array.countries定位,而不能用findViewById? - 为何在
R.layout中使用support_simple_spinner_dropdown_item? - 在Design标签页拖拽Spinner时仅能选择一种Spinner,这是正常的吗?
1. 为什么用R.array.countries而不是findViewById?
findViewById的作用是定位布局文件里的UI控件(比如你在xml里拖的Spinner、Button这类可视化元素),而strings.xml里的字符串数组属于非UI的资源数据,根本不是控件,所以findViewById找不到它。
Android会自动把res目录下所有资源(布局、字符串、数组、图片等)编译成R类,不同类型的资源对应R里不同的静态内部类:布局在R.layout,控件ID在R.id,字符串数组就在R.array里。所以要引用这个数组,必须用R.array.countries,这是Android资源系统的固定规则。
2. 为什么使用support_simple_spinner_dropdown_item?
首先得理清两个方法的作用:
ArrayAdapter.createFromResource的第三个参数,是Spinner收起状态下,当前选中项的显示布局setDropDownViewResource设置的是下拉展开后,每个选项的显示布局
你代码里其实写反了:通常android.R.layout.simple_spinner_item用于选中状态,androidx.appcompat.R.layout.support_simple_spinner_dropdown_item用于下拉选项。
至于为什么用这个带support_前缀的布局,因为它是AppCompat库提供的兼容布局,能在不同Android版本(尤其是低版本)上保持一致的样式,避免原生布局在旧系统上出现样式差异。如果你的项目依赖AppCompat库,优先用这类兼容布局来保证跨版本UI统一。
3. Design标签页拖拽Spinner只能选一种?
这是正常的。Design视图提供的是基础Spinner控件,它的基础样式是固定的,具体的显示效果、下拉选项的布局都要靠代码里的Adapter来配置——也就是你上面写的createFromResource和setDropDownViewResource这两行代码决定最终外观。
如果想要不同样式的Spinner,不需要在Design里选不同控件,只要自己定义布局文件(比如给选项加图标、修改文字大小颜色),然后在Adapter里替换成自定义布局即可。
内容的提问来源于stack exchange,提问作者steeveKA1

