如何实现聊天屏幕类型的软键盘行为?

时间:2018-09-18 11:40:05

标签: android android-recyclerview android-softkeyboard

我正在尝试在一个示例聊天应用程序中实现特定的键盘行为,该应用程序中,当用户打开键盘时,RecyclerView与键盘同步,但前提是最后一个可见的聊天可见。

示例:在WhatsApp打开键盘中,当最后一条消息可见时,该列表将随键盘一起上升,以便对用户保持可见。现在向上滚动一点,然后打开键盘,现在列表将保持不变,并且不会随键盘一起显示。

3 个答案:

答案 0 :(得分:0)

为实现与键盘一起向上滚动列表的行为,我从此处导出了解决方案:https://stackoverflow.com/a/34103263/1739882

并添加决定是否滚动列表的自定义行为,我以此获取了最后一个可见项目:

linearLayoutManager.findLastVisibleItemPosition()

,并使用一个标志来处理场景。这是完整的代码:

//Setup editText behavior for opening soft keyboard
    activityChatHeadBinding.edtMsg.setOnTouchListener((v, event) -> {
        InputMethodManager keyboard = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (keyboard != null) {
            LinearLayoutManager linearLayoutManager = (LinearLayoutManager) activityChatHeadBinding.recyclerView.getLayoutManager();
            isScrollToLastRequired = linearLayoutManager.findLastVisibleItemPosition() == chatNewAdapter.getItemCount() - 1;
            keyboard.showSoftInput(findViewById(R.id.layout_send_msg), InputMethodManager.SHOW_FORCED);
        }
        return false;
    });

//Executes recycler view scroll if required.
activityChatHeadBinding.recyclerView.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
            if (bottom < oldBottom && isScrollToLastRequired) {
                activityChatHeadBinding.recyclerView.postDelayed(() -> activityChatHeadBinding.recyclerView.scrollToPosition(
                        activityChatHeadBinding.recyclerView.getAdapter().getItemCount() - 1), 100);
            }
        });

答案 1 :(得分:0)

您可以像这样直接在活动标签内的清单文件中添加windowSoftInputMode:-

struct ListNode
{
    int       m_nValue;
    ListNode* m_pNext;
};

如果有任何疑问,您可以询问。

答案 2 :(得分:0)

只需添加

android:windowSoftInputMode = "adjustResize"

清单中您的活动标签内。