如何在选中Spinner时移除TextInputLayout的焦点?
解决Spinner展开时TextInputLayout焦点未移除的问题
我来帮你搞定这个问题!核心思路就是在Spinner准备展开下拉列表的瞬间,主动清除两个TextInputEditText的焦点,同时让页面根布局获取焦点,彻底移除输入框的焦点状态。下面给你两个实用的实现方案:
方案一:监听Spinner的触摸事件(简单直接)
这种方式最容易实现,只需要给Spinner设置触摸监听,当用户触摸Spinner时就处理焦点清除:
首先,记得先给布局里的两个TextInputEditText加上id,比如:
<!-- 第一个输入框 --> <android.support.design.widget.TextInputEditText android:id="@+id/edit_text_dislike" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="I don't like"/> <!-- 第二个输入框 --> <android.support.design.widget.TextInputEditText android:id="@+id/edit_text_favourite" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="My favourite"/>
然后在MainActivity里添加触摸监听:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Spinner spinner = findViewById(R.id.planets_spinner); // 初始化Spinner的adapter代码保持不变... ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.planets_array, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); // 添加触摸监听处理焦点 spinner.setOnTouchListener((v, event) -> { if (event.getAction() == MotionEvent.ACTION_UP) { // 获取两个输入框 TextInputEditText dislikeEt = findViewById(R.id.edit_text_dislike); TextInputEditText favouriteEt = findViewById(R.id.edit_text_favourite); // 清除输入框焦点 dislikeEt.clearFocus(); favouriteEt.clearFocus(); // 让根布局获取焦点,确保输入框的焦点状态完全消失 View rootView = findViewById(android.R.id.content); rootView.requestFocus(); } return false; // 返回false,让Spinner继续处理触摸事件,正常展开下拉列表 }); }
方案二:监听Spinner的展开事件(更精准)
如果你的项目使用了Material Design的MaterialSpinner(com.google.android.material.spinner.MaterialSpinner),可以直接监听下拉列表的展开事件,时机更精准:
// 替换成MaterialSpinner MaterialSpinner spinner = findViewById(R.id.planets_spinner); // 初始化adapter代码不变... // 监听下拉展开事件 spinner.setOnDropdownPopupShowListener(() -> { clearInputFocus(); }); // 封装清除焦点的方法,复用更方便 private void clearInputFocus() { TextInputEditText dislikeEt = findViewById(R.id.edit_text_dislike); TextInputEditText favouriteEt = findViewById(R.id.edit_text_favourite); dislikeEt.clearFocus(); favouriteEt.clearFocus(); findViewById(android.R.id.content).requestFocus(); }
如果是原生Spinner,也可以通过反射来监听展开状态,但一般方案一就足够满足需求了。
小提示
为什么要让根布局获取焦点?因为如果只调用clearFocus(),输入框可能因为没有其他可聚焦的View而不会真正失去焦点状态,让根布局请求焦点可以确保输入框的焦点被彻底移除,同时还能自动收起软键盘(如果之前是弹出状态的话)。
内容的提问来源于stack exchange,提问作者buellas
相关产品推荐
相关产品推荐

