RecyclerView中TextInputLayout点击EditText无动画问题求助
解决RecyclerView中TextInputLayout提示动画不生效的问题
这种情况我在开发中也碰到过,结合你的描述,大概率和焦点拦截或者RecyclerView的视图复用机制有关,给你几个具体的排查和解决方向:
1. 排查焦点是否被拦截
RecyclerView的Item布局很容易出现焦点被父控件拦截的情况,导致TextInputEditText无法正常获取焦点,进而触发不了提示动画:
- 检查Item的根布局(或者TextInputLayout的父布局)有没有设置
android:focusable="true"或android:focusableInTouchMode="true",如果有,去掉这些属性,确保焦点能传递到EditText。 - 给TextInputEditText显式添加焦点相关属性:
<android.support.design.widget.TextInputEditText ... android:focusable="true" android:focusableInTouchMode="true" /> - 检查是否有自定义ViewGroup重写了
onInterceptTouchEvent方法,无意中拦截了触摸事件,导致EditText无法获取焦点。
2. 处理RecyclerView的视图复用问题
ViewHolder复用的时候,之前的焦点状态可能被保留,导致动画触发异常,需要在绑定数据时重置焦点状态:
override fun onBindViewHolder(holder: YourInputViewHolder, position: Int) { // 绑定DataBinding数据 holder.binding.hint = yourHintList[position] holder.binding.viewModel = yourViewModel holder.binding.executePendingBindings() // 重置焦点,避免复用导致的状态残留 holder.binding.inputText.clearFocus() // 如果需要特定位置的EditText默认获取焦点,可在此处判断后调用requestFocus() // if (position == targetPosition) holder.binding.inputText.requestFocus() }
3. 检查库版本与属性冲突
- 如果你还在使用旧的
android.support.design库,建议迁移到com.google.android.material库(Support库已停止维护),新版本修复了很多焦点和动画相关的bug。 - 确保TextInputLayout本身没有设置
android:hint属性,你的代码是通过DataBinding把hint绑定到EditText,这没问题,但如果TextInputLayout也设置了hint,会导致两者冲突,动画无法正常触发。
4. 兜底方案:手动触发动画
如果上面的方法都无效,可以通过监听EditText的焦点变化,手动触发TextInputLayout的提示动画:
holder.binding.inputText.setOnFocusChangeListener { view, hasFocus -> val textInputLayout = holder.binding.root as TextInputLayout if (hasFocus) { // 获取焦点时,启用动画并播放入场动画 textInputLayout.hintAnimationEnabled = true val inAnim = AnimationUtils.loadAnimation(view.context, R.anim.design_text_input_hint_animation_in) textInputLayout.startAnimation(inAnim) } else { // 失去焦点且文本为空时,播放退场动画 if (TextUtils.isEmpty(view.text)) { val outAnim = AnimationUtils.loadAnimation(view.context, R.anim.design_text_input_hint_animation_out) textInputLayout.startAnimation(outAnim) } } }
内容的提问来源于stack exchange,提问作者breakline
相关产品推荐
相关产品推荐

