在"循环器视图"中的"编辑文本"滚动到屏幕外时隐藏键盘

Dav*_*vid 10 android android-edittext android-recyclerview

我有一个RecyclerView包含EditText子元素.当选EditText中的屏幕滚动时,我想隐藏软键盘.如何判断EditText屏幕上何时不再显示?是否有一些事件监听器可以附加到EditText元素上来说明?

Har*_*rim 22

实现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;
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 每当您触摸它引发事件的视图时,这个解决方案对应用程序来说不是过度吗? (5认同)

小智 5

这对我有用:我用RecyclerView.OnScrollListenerwithPublishRelay来消除事件的抖动。

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()
    }
}

Run Code Online (Sandbox Code Playgroud)

一旦视图从屏幕上滚动,焦点就会上升到 recyclerView。因此,我们可以使用RecyclerView.OnScrollListener. onScrolled跟踪甚至最轻微的视图滚动。这就是为什么我们需要补充一点debounce,我们不会收到很多事件。

hideKeyboardaddTo是扩展函数:

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)
    }

Run Code Online (Sandbox Code Playgroud)