Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将“回收器”视图中的编辑文本滚动到屏幕外时隐藏键盘_Android_Android Edittext_Android Recyclerview - Fatal编程技术网

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 }