安卓ListView滚动后自动隐藏键盘

11

我是Android的新手,请帮助我实现在滚动ListView后自动隐藏它,这是我的代码,但是我无法得到正确的解决方案。

xml文件:

<ListView
    android:id="@+id/offline_list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#dde1e3"
    android:clickable="true"
    android:focusable="true"
     >
</ListView>

代码:

        lvCustomList.setOnFocusChangeListener(new View.OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            // TODO Auto-generated method stub
            if(!hasFocus)
                hideKeyboard(v);

        }

        private void hideKeyboard(View view) {
            // TODO Auto-generated method stub
            InputMethodManager inputMethodManger = (InputMethodManager)getSystemService(Activity
                    .INPUT_METHOD_SERVICE);
            inputMethodManger.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    });

https://dev59.com/rW855IYBdhLWcg3wvnKE#11656129 - Sree
@Sree 上面代码有什么问题? - Viks
我认为你正在传递视图,请将其更改为活动,有时会起作用。 - Sree
5个回答

38

试试这个...

为什么不像下面这样对 ListView 使用 OnTouchListener

lvCustomList.setOnTouchListener(new OnTouchListener() {
    @Override
        public boolean onTouch(View v, MotionEvent event) {

            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(edittext.getWindowToken(), 0);

        return false;
    }
});

这是在触摸ListView后正确隐藏键盘,但我无法滚动列表。 - Viks
1
我在你上面的代码中找到了解决方案,'return false' 给出了所需的解决方案。 - Viks

2

最好使用onScrollStateChanged而不是onScroll,并且使用scrollState == 0。这样当用户真正滚动时,键盘将隐藏。

listview.setOnScrollListener(new AbsListView.OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view,
                                         int scrollState) {

            if (scrollState == 0) {
                InputMethodManager inputMethodManger = (InputMethodManager) getActivity().getSystemService(Activity
                        .INPUT_METHOD_SERVICE);
                inputMethodManger.hideSoftInputFromWindow(view.getWindowToken(), 0);
            }
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                             int visibleItemCount, int totalItemCount) {


        }
    });

滚动状态 == 0 表示空闲吗?可能需要使用RecyclerView.SCROLL_STATE_DRAGGING - doubleA

0
recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            //Hide keyboard code
            InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
            //Find the currently focused view, so we can grab the correct window token from it.
            View view = activity.getCurrentFocus();
            //If no view currently has focus, create a new one, just so we can grab a window token from it
            if (view == null) {
                view = new View(activity);
            }
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    });

此线程与ListView有关,而非RecyclerView。 - Himanshu Rawat
1
虽然这段代码可能提供了问题的解决方案,但最好添加上为什么/如何工作的上下文。这可以帮助未来的用户参考并最终将此知识应用于他们自己的代码。当代码得到解释时,您还可能会获得用户的积极反馈/赞同。 - Amit Verma

0

Recyclerview,在滚动时隐藏键盘 - SCROLL_STATE_DRAGGING(由@doubleA提到)

    public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);

        if(newState == RecyclerView.SCROLL_STATE_DRAGGING){
            InputMethodManager imm = (InputMethodManager) recyclerView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(recyclerView.getWindowToken(), 0);
        }
    }


-1

试试这个。

listview.setOnScrollListener(new OnScrollListener() {

                @Override
                public void onScrollStateChanged(AbsListView view,
                        int scrollState) { // TODO Auto-generated method stub

                }

                @Override
                public void onScroll(AbsListView view, int firstVisibleItem,
                        int visibleItemCount, int totalItemCount) {
                    InputMethodManager inputMethodManger = (InputMethodManager)getSystemService(Activity
                    .INPUT_METHOD_SERVICE);
            inputMethodManger.hideSoftInputFromWindow(view.getWindowToken(), 0);

                }
            });

希望有所帮助。干杯!


1
但是这段代码只在我尝试搜索商品时显示键盘几毫秒。 - Viks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接