记录spinner/popupwindow点击选项时页面自动滚到顶部的解决办法

在含有多个EditText和Spinner的表单页面中,遇到选择Spinner或PopupWindow后页面自动滚动到顶部,影响用户体验。尝试过将Spinner替换为PopupWindow,但问题依旧。分析发现是由于点击EditText弹出选择项时,焦点转移导致页面滚动。通过在focusable=false的EditText点击事件中阻止其他EditText获取焦点,问题得到解决。最终解决方案是对表单布局容器设置防止焦点转移。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

页面是个有很多EditText和Spinner的表单录入页面 由于跨页所以用ScrollView嵌套

当选择Spinner的下拉项时 Spinner下拉面板正常关闭同时页面滚动到顶部 很影响用户使用 这样肯定不行

开始以为当spinner在scrollview时 存在android版本兼容问题

于是改成了popupwindow 比spinner麻烦好多 页面有多个EditText用于弹出popupwindow展示不同的下拉数据 点击TextView要记录当前的EditText当点击popupwindow的列表项关闭popupwindow时要取到数据手动调用之前记录的EditText的setttext方法

而用spinner 这一切都是自动的

前面都是废话 结果用popupwindow实现完后还是一样 会自动滚动到顶部 这时才仔细分析问题原因 

原来是在点击EditText(设置了clickable=true;focusable=false)弹出spinner/popupwindow时焦点在页面外的EditText上 ,于是关闭spinner/popupwindow时页面自动滚动到获取焦点的EditText 

解决思路是 在focusable=false的EditText的点击事件里去掉焦点时不让其他的EditText自动获取焦点

最初的解决方案是这样的

if (getCurrentFocus()!=null) {
   getCurrentFocus().clearFocus();
}

popupwindow试了没问题 但对spinner不起作用 于是搜clearFocus不起作用 最终解决方案是这样的

给表单布局容器设置

android:focusableInTouchMode="true"
spinner.setOnItemSelectedListener 在onItemSelectedListener的onItemSelected方法内让表单容器requestFocus()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值