Spinner(3): OnItemSelectedListener 触发时机

Android Spinner在Kotlin中的陷阱与现代化重构 Spinner作为Android基础选择控件,本质是数据绑定、生命周期与线程安全的交汇点。其原理涉及Adapter通知机制、Configuration Change状态恢复及触摸事件分发逻辑;技术价值在于支撑地址三级联动、异步城市列表加载等高可靠场景;典型应用包括电商收货地址选择、多语言国家下拉、无障碍兼容表单等。然而在Kotlin工程实践中,ArrayAdapter线程不安全、LiveData状态表达力不足、NestedScrollView嵌套失效等问题频发,导致ANR与崩溃。本文聚焦Spinner在现代 阅读详情

博客 Spinner(1): 由SDK引发的问题、Spinner(2): 动态添加资源 简单介绍了spinner,但是 Spinner 还有陷阱,所以使用时应该注意。

本篇博客继续探讨Spinner及其注意事项,欢迎拍砖。

 


推荐一个网站,关于人工智能教程,教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点 这里 可以跳转到教程。


 

为 Spinner 设置 OnItemSelectedListener、OnTouchListener、OnFocusChangeListener 事件,看看在什么情况下触发这些事件。

 

看代码,如下:

package mark.zhang;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

public class SpinnerTestActivity extends Activity {
	private static final String[] strArrays = {"w" , "x", "y", "z"};
	private Spinner mSpinner;
	private ArrayAdapter<String> adapter;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		mSpinner = (Spinner) findViewById(R.id.mySpinner);
		adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, strArrays);
		// 自定义spinner下拉样式
		adapter.setDropDownViewResource(R.layout.myspinner_dropdown);
		mSpinner.setAdapter(adapter);
		// 设置选择条目事件
		mSpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {

					@Override
					public void onItemSelected(AdapterView<?> arg0, View arg1,
							int arg2, long arg3) {
						Log.d("mark", "onItemSelected() is invoked!");
						arg0.setVisibility(View.VISIBLE);
					}

					@Override
					public void onNothingSelected(AdapterView<?> arg0) {
					}
				});
		// 设置触摸事件监听
		mSpinner.setOnTouchListener(new Spinner.OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				Log.d("mark", "onTouch() is invoked!");
				v.setVisibility(View.INVISIBLE);
				return false;
			}
		});
		// 设置焦点变化事件监听
		mSpinner.setOnFocusChangeListener(new Spinner.OnFocusChangeListener() {

			@Override
			public void onFocusChange(View v, boolean hasFocus) {
				Log.d("mark", " onFocusChange() is invoked!");
			}
		});
	}
}

代码中,创建 ArrayAdapter 对象的同时,为 spinner 添加备选项目:

 

 

adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, strArrays);

直接运行该 Android project,看看效果:

 

 

D/mark    ( 1799): onItemSelected() is invoked!

 

 

 

 

 

注意:此时spinner中有默认显示值。

 

可以看出,OnItemSelectedListener 监听事件 onItemSelected 被调用。这就很让人奇怪,根本没有点击 Spinner,为何会触发该事件呢???

 

如果您好奇的话,跟我一起测试吧!

 

这样来创建ArrayAdapter对象:

 

adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);

运行,没有任何信息出现。说明此时没有触发上述的任何监听器设置的监听器。

 

 

 

 

 

注意:此时 spinner 中没有任何默认显示值。

 

再做一个测试,修改代码如下:

 

adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
for(int i = 0; i<5; i++) {
	adapter.add("mark" + i);
}

运行:

 

 

D/mark    ( 5890): onItemSelected() is invoked!

 

 

 

 

 

呵呵,OnItemSelectedListener 监听事件 onItemSelected 被调用。

 

当我们点击 Spinner 的下拉列表时,一定会触发 OnTouchListener的onTouch 事件。但是不一定会触发 OnItemSelectedListener的onItemSelected 事件。

 

如果,当前 Spinner 的默认显示是 mark0,那么再次点击 mark0 的话,打印结果:

 

D/mark    ( 5890): onTouch() is invoked!
D/mark    ( 5890): onTouch() is invoked!

可以看出,OnItemSelectedListener 的 onItemSelected 事件没有被触发,但是 OnTouchListener的onTouch 事件被触发两次。

 

如果,你点击选项列表的其它值如 mark1,打印结果:

 

D/mark    ( 5890): onTouch() is invoked!
D/mark    ( 5890): onTouch() is invoked!
D/mark    ( 5890): onItemSelected() is invoked!

呵呵,很戏剧化!

 

最后一个问题,何时触发 OnFocusChangeListener 事件,很简单,运行 App 之后,随便改变当前焦点,就会触发该事件。

 

知道这样的结果之后,很无语!但是知道总比不知道好,至少您可以采取一点措施来避免一些不必要的麻烦。

 

比如,每次都想获取 spinner 的值,就可以为其绑定 onTouch 事件(因为该事件每次点击都会被触发),但是注意,点击 spinner 一次,会触发该事件很多次(touch 包括很多动作如 down、up、move),那麽我们就在 event 事件的 down 事件里面写我们的代码。即按下有效,up、move 等无效即可。

 

Android Spinner 深度解析:Kotlin 开发中的状态管理与 Adapter 实践 Spinner 是 Android View 系统中实现单选弹出式状态选择的核心控件,其本质是封装了弹出逻辑、焦点管理与生命周期协同的轻量级菜单组件。它基于 AdapterView 架构,依赖 Adapter 模式解耦数据与 UI 渲染,通过 onItemSelectedListener 提供用户交互反馈。在 Kotlin 工程实践中,需特别关注协程作用域(如 lifecycleScope)与 UI 线程更新的时序安全、ArrayAdapter 与 BaseAdapter 的适用边界,以及 setSelec 阅读详情

相关推荐

CMake、Make、MinGw、Clang、Llvm、GCC、MSVC的区别

除开 GCC (GNU 编译器集合) 以外,MinGW 还包含有一些其他的 GNU 程序开发工具;的缩写,MinGw是windows版本的gcc集合。并不仅是一个 C/C++ 编译器,而是一套。是微软开发的VC运行时库,3、Make和CMake是。

m0_37698164的博客 1万+

Android Spinner Kotlin最佳实践:零依赖下拉控件重学指南

Spinner是Android原生下拉选择控件,基于AdapterView实现,其核心原理是通过ArrayAdapter绑定数据源并响应用户单选事件。凭借零第三方依赖、低内存占用、系统级无障碍支持和声明式XML绑定(android:entries)等技术价值,它在政务、医疗、IoT等强调兼容性(minSdk ≤ 16)、包体敏感(<8MB)及合规性(WCAG AA)的场景中不可替代。相比RecyclerView+PopupWindow或Compose DropdownMenu,Spinner在老版本兼容、渲

axfcjwkbi259888707的博客 404

基于Gardner环的QPSK定时同步MATLAB仿真:四倍采样与多场景性能分析

本文详细介绍了基于Gardner环的QPSK定时同步MATLAB仿真方法,重点分析了四倍采样技术在定时同步中的应用与性能优化。通过MATLAB代码实例展示了Gardner环的实现原理、多场景性能分析及常见问题解决方案,为数字通信系统的定时同步设计提供实用参考。

weixin_29083475的博客 373

第21章、OnItemSelectedListener事件(从零开始学Android)

在Android App应用中,OnItemSelectedListener事件也会经常用到,我们一起来了解一下。   基本知识点:OnItemSelectedListener事件 一、界面    1、新建province.xml件。   在“res/values”位置新建province.xml文件。   (1)province.xml文件位置如下图所示:      (2)pr

jianghuiquan的专栏 6万+

大语言模型在建筑规范自动化合规审查中的微调策略与规模效应实践

大语言模型(LLM)通过在海量文本数据上预训练,具备了强大的语言理解和生成能力。其核心原理是基于Transformer架构,通过自注意力机制捕捉长距离依赖关系。在工程实践中,为了将这种通用能力适配到建筑、法律、金融等高度专业化的垂直领域,通常需要采用领域微调技术。微调通过使用特定领域的高质量指令数据对模型参数进行更新,使其掌握专业术语、逻辑规则和任务范式,从而解决通用模型在专业场景下知识匮乏和“幻觉”问题。结合检索增强生成(RAG)技术,将动态外部知识库作为模型的“参考手册”,能进一步提升事实准确性并降低幻

weixin_30667831的博客 362

整车的智能配电系统

本文探讨了汽车电网安全的重要性,分析了传统汽车电网的现状,并重点介绍了半导体在汽车智能配电系统中的作用。半导体凭借其单向导电性和可控性,如二极管、MOSFET等,提供了更高效、安全的电力控制。通过对比传统保险丝与半导体器件,阐述了半导体在过流保护、电压监测和故障诊断方面的优势,强调其在减少安全隐患、提高能源管理和续航里程方面的贡献。极氪智能配电系统展示了如何运用半导体技术实现整车能源的精细化管理,降低维修成本,减少线束复杂性,提升安全性能。

让你爱上电路设计 1612

Spinner初始化不触发onItemSelected

Spinner在初始化时会自动调用一次OnItemSelectedListener事件, 但在实际开发过程中,我们不需要此功能.本人通过总结,终于找到最简单的解决方法  提供的解决办法: 第一步:设定Spinner数据源 第二步:注册事件之前调用 spinner.setSelection(0, true); 第三步:注册事件 第四步:将事件中判断 spinner选择索引结果为0,则退出

路虽远,行则将至;事虽难,做则必成! 5610

海康visionmaster开发笔记10-集成HALCON第三方算子到VM工具箱的方法

海康visionmaster开发笔记10-HALCON第三方算子到VM工具箱的方法

视觉人机器视觉的博客 4347

Spinner(下拉列表)的使用

下拉列表的使用

A125679880的博客 5733

duilib 实现截屏选取功能分析

本文关注点不再截屏而是截屏选取工具 1首先肯定是个透明窗口,且置顶并且是工具窗口(任务栏不显示窗口图标) 窗口样式 <?xml version="1.0" encoding="utf-8"?> <Window shadowattached="false"> <Box > <VBox name="track_box" margin="200,200,200,200" bkimage="file='screen_bord...

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 908

FT2004(D2000)开发实战之网口stmmac报错调试(Failed to reset the dma)

网口stmmac报错调试(Failed to reset the dma)

嵌入式Linux 3584

android spinner 调用onItemSelectedListener的思考

由于项目从别人手中接收,所以很多暗坑自己不知道,于是今天先总结一个。 在使用spinner的过程中,我们设置了setOnItemSelectedListener,来实现选择条目的操作,当我们在onCreate()中实现spinner的相关方法时,总是发现spinner会调用一次自己的OnItemSelectedListener中的onItemSelected()回调方法。这个很苦恼,于是先尝试在

lsyAndroid的专栏--解决实际开发中自己遇到的问题 4715

前端开发 - 完美解决video.js和flv.js视频同时播放数量限制的问题,即浏览器针对同一域名的请求限制问题(解决flv.js/video.js在页面播放最多不超过6个问题、浏览器并发请求限制数

flv.js,video.js,vue,reactive,uniapp,前端开发,flv视频同时播放有限制怎么办,浏览器限制多个视频同时播放怎么办,使用flv.js在前端播放,最多只能播放6个视频,突破浏览器域名并发限制,如何解决flvjs与videojs视频播放同时播放数量限制,video.js 一个页面同时播放多个视频的实例代码,解决网页视频最大只能播放6路的问题,浏览器只能播放6路http-flv流的解决方法,一个浏览器播放5个或者6个flv的视频就不能播放了,video.js 无法在页面同时播放多个

✅ 精选推荐文章 4995

Spinner的setOnItemSelectedListener(

第一个颜色选择Spinner数据来源于Values文件夹内的arrays.xml文件,             红色         橙色         黄色         绿色         蓝色         紫色     通过下面的方法从一个资源XML文件中加载数据,创建一个数组类的适配器对象,布局文件是使用系统提供的layout.simple_sp

cicong111111的专栏 3820

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Spinner(3): OnItemSelectedListener触发时机

在前面两篇博客Spinner(1): 由SDK引发的问题、Spinner(2): 动态添加资源简单介绍了spinner,但是Spinner的陷阱很多,所以使用时应该注意。 本篇博客继续探讨Spinner及其注意事项,欢迎拍砖。 为Spinner设置OnItemSelectedListener、OnTouchListener、OnFocusChangeListener 事件,看看在什么情况下触发...

mmdev 289

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spinner OnItemSelectedListener 触发时机

引用自:http://blog.csdn.net/veryitman/article/details/6670153 博客 Spinner(1): 由SDK引发的问题、Spinner(2): 动态添加资源 简单介绍了spinner,但是 Spinner 还有陷阱,所以使用时应该注意。 本篇博客继续探讨Spinner及其注意事项,欢迎拍砖。 为 Spinner

鑫的专栏 976

android spinner保存对象,Android Spinner:在初始化期间避免onItemSelected调用

Android Spinner:在初始化期间避免onItemSelected调用我用Spinner和TextView创建了Android应用程序。我的任务是在TextView的Spinner的下拉列表中显示所选项目。 我在onCreate方法中实现了Spinner,因此当我运行程序时,它会在TextView中显示一个值(在从下拉列表中选择项目之前)。我只想在从下拉列表中选择一个项目后才在TextV...

weixin_39774808的博客 625

Android RadioGroup与Spinner深度交互:即时响应、样式自定义与动态数据管理

在Android应用开发中,UI控件是构建用户交互的基础。RadioGroup和Spinner作为核心选择控件,其设计原理直接影响用户体验。RadioGroup通过OnCheckedChangeListener实现即时反馈,将用户选择与业务逻辑同步,减少了操作步骤,提升了交互流畅度。Spinner则通过Adapter模式实现数据与视图的分离,支持灵活的数据绑定与样式定制。这些控件的深度应用,尤其在物联网设备管理、消费电子App等场景中,能够显著提升应用的易用性与品牌一致性。本文聚焦RadioGroup的即时

weixin_30363981的博客 430

从零开始学android:Android事件处理—下拉列表框与OnItemSelectedListener

下拉列表监听 Spinner组件的主要功能是用于进行下拉列表显示的功能,当用户选中下拉列表中的某个选项之后可以使用Spinner类中提供的setOnItemClickListener()方法进行监听。 范例:联动菜单实现 布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

牛儿吃草的博客 4662

spinner中的onNothingSelected方法到底什么时候调用?

这个东东大家在开发中可能不太能用到,所以总是容易被忽略,由于工作原因,我最近琢磨了一下onNothingSelected方法的调用时机问题,其实很简单,只要我们稍微看一下源码就明白了: /** * Callback method to be invoked when the selection disappears from this * vi...

weixin_30788619的博客 397

Spinner的OnItemSelectedListener事件(在布局文件中通过Spinner的android:entries属性加载列表)

一、界面    1、新建province.xml件。   在“res/values”位置新建province.xml文件。   (1)province.xml文件位置如下图所示:      (2)province.xml内容如下:        (3)代码   [html] view plaincopy xml 

yinzhijiezhan的专栏 2678

Android关于Spinner只能使用onItemSelectedListener事件源码分析

可以看到该方法也被禁用了,提示我们切换setOnItemClickListener,但setOnItemClickListener方法在Spinner被实现并禁用了,那么只剩下onItemSelectedListener没被Spinner实现并且在AdapterView中可用。Spinner的父类AbsSpinner源码中并没有实现任何其父类AdapterView的任何类似点击事件,所以所有事件都交给Spinner去实现,这里禁用了setOnItemClickListener事件,点击事件还剩下。

Alo Rui 的博客 596

Spinner的OnItemSelectedListener的onItemSelected方法的四个参数含义

public void onItemSelected(AdapterView parent, View view, int position, long id) { } 在上面的onItemSelected方法中: 第一个参数parent是你当前所操作的Spinner,当某一个Activity中有多个Spinner时,可以根据parent.getId()与R.id.currentSpin

yinzhijiezhan的专栏 1万+

Spinner初始化自动触发onItemSelected

Spinner在初始化时会自动调用一次OnItemSelectedListener事件, 但在实际开发过程中,我们不需要此功能.本人通过总结,终于找到最简单的解决方法 提供的解决办法: 第一步:设定Spinner数据源 第二步:注册事件之前调用 spinner.setSelection(0, true); 第三步:注册事件 第四步:将事件中判断 spinner选择索引结果为0,则退出事

猿子 6484

Android开发之Spinner控件使用

之前博客中已经介绍了Spinner控件的数据绑定,地址在:http://blog.csdn.net/zdw_wym/article/details/50000357,本篇将介绍Spinner的事件监听器:OnItemSelectedListener 。      Spinner组件的主要功能是用于进行下拉列表的显示,当用户选中下拉列表中的某个选项后可以使用Spinner类提供的setOnItemS

分享经验,共同进步. 4109

Android 最简单解决代码初始化Spinner选中会触发onItemSelected

Android 代码初始化Spinner选中会触发onItemSelected问题描述解决方案完事 问题描述 在开发中遇到当进入页面,给予Spinner一个默认值的时候,会触发我们的onItemSelected监听事件。由于我的设计要求是在spinner中选中一个item时会关闭当前页面。导致我一打开页面就关闭了,好气哟。 解决方案 kotlin代码 首先,我们新建一个变量,这个变量就是你需要...

杨迪龙的博客 2907
上一篇: typedef、define
下一篇: pull xml(2): 解析xml文件
veryitman
博客等级 码龄16年 472粉丝 310原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值