Android 将“回收器”视图中的编辑文本滚动到屏幕外时隐藏键盘
我有一个包含Android 将“回收器”视图中的编辑文本滚动到屏幕外时隐藏键盘,android,android-edittext,android-recyclerview,Android,Android Edittext,Android Recyclerview,我有一个包含EditText子元素的RecyclerView。当所选的EditText滚动到屏幕外时,我想隐藏软键盘。如何判断EditText何时不再显示在屏幕上?是否有一些事件监听器可以附加到EditText元素来告诉我 实现onTouchListener如下: yourRecycleView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v,
EditText
子元素的RecyclerView
。当所选的EditText
滚动到屏幕外时,我想隐藏软键盘。如何判断EditText
何时不再显示在屏幕上?是否有一些事件监听器可以附加到EditText
元素来告诉我 实现onTouchListener
如下:
yourRecycleView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
return false;
}
});
我的解决方案:
editText.setOnFocusChangeListener((v, hasFocus) -> {
Handler handler = new Handler();
if (!hasFocus) {
handler.postDelayed(() -> {
if (!editText.hasFocus()) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, 0);
}
}, 200);
}
});
这就是我的工作原理:我使用
RecyclerView.OnScrollListener
和PublishRelay
来消除抖动事件
class RecyclerViewActivity : Activity(){
...
private val scrollableRelay = PublishRelay.create<Unit>()
private val disposable = CompositeDisposable()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
recyclerView.addOnScrollListener(object: RecyclerView.OnScrollListener(){
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
scrollableRelay.accept(Unit)
}
})
scrollableRelay
.debounce(100, TimeUnit.MILLISECONDS)
.subscribe({
if (currentFocus == recyclerView) {
hideKeyboard()
}
})
.addTo(disposable)
}
override fun onDestroy() {
disposable.onDestroy()
}
}
Kotlin解决方案,在以下情况下关闭键盘:
- 聚焦的
从视图
回收视图
- 或者,如果用户按Enter键,操作系统无法在
中找到需要关注的内容回收视图
//当键盘不再关注recyclerview中的任何内容时,请关闭键盘
recyclerView.viewTreeObserver.addOnGlobalFocusChangeListener{{},newFocus:View?->
if(newFocus==recyclerView | | recyclerView!in(newFocus?.祖先?:emptySequence()){
recyclerView.context.inputService.hideSoftInputFromWindow(recyclerView.windowToken,0)
}
}
val Context.inputService get()=作为InputMethodManager的getSystemService(Context.INPUT\u方法\u服务)
val View.祖先:序列get()=generateSequence(this){it.parent as?View}
我必须将edittext.getWindowToken()更改为v.getWindowToken(),因为编辑文本是RecycleView适配器的私有成员。然而,这很有效。谢谢。如何删除突出显示的关于“执行单击”的警告不会被覆盖此解决方案对应用程序来说不是太过了吗?每当您触摸视图时,它会引发事件?如果我在滚动之前隐藏键盘,您的解决方案会显示键盘
class RecyclerViewActivity : Activity(){
...
private val scrollableRelay = PublishRelay.create<Unit>()
private val disposable = CompositeDisposable()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
recyclerView.addOnScrollListener(object: RecyclerView.OnScrollListener(){
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
scrollableRelay.accept(Unit)
}
})
scrollableRelay
.debounce(100, TimeUnit.MILLISECONDS)
.subscribe({
if (currentFocus == recyclerView) {
hideKeyboard()
}
})
.addTo(disposable)
}
override fun onDestroy() {
disposable.onDestroy()
}
}
fun Disposable.addTo(compositeDisposable: CompositeDisposable) {
compositeDisposable.add(this)
}
fun Activity.hideKeyboard() =
currentFocus?.let {
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(it.windowToken, 0)
}
// dismiss the keyboard when it is no longer focusing on anything inside the recyclerview
recyclerView.viewTreeObserver.addOnGlobalFocusChangeListener { _, newFocus: View? ->
if (newFocus == recyclerView || recyclerView !in (newFocus?.ancestors ?: emptySequence())) {
recyclerView.context.inputService.hideSoftInputFromWindow(recyclerView.windowToken, 0)
}
}
val Context.inputService get() = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
val View.ancestors: Sequence<View> get() = generateSequence(this) { it.parent as? View }