Android开发:让EditText不可点击但可通过CardView触发获焦点
哈哈,这个需求我之前做项目的时候刚好碰到过!给你两个比隐藏EditText优雅得多的解决方案,完美适配你的要求:
方案一:利用布局属性直接控制(推荐)
你需要的其实是让EditText只有通过代码触发才能获取焦点,而不是触摸它的时候自动获取。这时候可以用focusableInTouchMode这个属性——它和focusable是相互独立的:
在你的EditText布局里加上这一行:
android:focusableInTouchMode="false"
设置之后,点击EditText本身不会触发焦点,但它的focusable依然是true,所以你原来在CardView点击事件里的requestFocus()和唤起软键盘的代码完全可以正常工作。这个方案零Java代码,纯布局配置就能搞定,最省心!
方案二:拦截EditText的触摸事件
如果因为某些原因不能修改布局属性(比如用了封装好的自定义EditText),可以通过代码拦截EditText的触摸事件,让它不响应点击:
etProblem.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // 把触摸事件消费掉,不让EditText触发默认的焦点逻辑 return true; } });
这样点击EditText的时候,事件会被这个监听器吃掉,不会触发焦点,但你通过CardView调用etProblem.requestFocus()依然有效,软键盘也能正常唤起。
你之前用的隐藏EditText的方法虽然能凑合用,但容易出现布局闪烁的问题,体验不够流畅,上面这两个方案就没有这个问题啦~
内容的提问来源于stack exchange,提问作者ClassA




