如何在android中处理聊天屏幕的键盘行为

时间:2015-07-23 06:32:10

标签: android android-softkeyboard

以下是聊天屏幕的要求: 1.)屏幕出现时默认显示上一条消息。 2.)如果我在最后一个消息框中,并单击消息框内部,则应向上滚动消息框,并在此框上方显示最后一条消息。标题不应该消失。 3.)如果我在聊天消息之间,并在消息框内单击,则只有消息框应位于键盘的上方,而不是消息列表。请记住,标题应该在所有情况下都可见。标题是RelativeLayout。

以下是分析要求所需的部分屏幕:

Chat screen and "nd" is last message

Last message scrolls but header is not visible

以下是我正在处理softkeypad行为的一部分代码:

以下是与以下内容相关的代码: 这是sendbox OnClick的代码:

case R.id.editEmojicon : {

                if (messagesItems != null && messagesItems.size() > 0) {
                    currentMessageID = adapter.getCurrentMessageID();
                    lastMessageID = messagesItems.get(messagesItems.size() - 1).getMessageId();

                    if (lastMessageID.equalsIgnoreCase(currentMessageID))// i.e. We are on last message so scroll screen to last and last should be upside of message box
                    {
                        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
                    } else // We are not on last message so don't scroll the screen
                    {
                        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
                    }
                    break;
                }

2 个答案:

答案 0 :(得分:0)

您应将标题对齐到顶部,将聊天栏(使用编辑文本)对齐到底部,并将layout_above和layout_below设置为滚动视图,如下所示:

    <RelativeLayout
    ...
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >

    <RelativeLayout
            android:layout_alignParentTop="true"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/header"
            >

      ...
    </RelativeLayout>
    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@+id/chat_bar"
        android:layout_below="@+id/header"
        >
    </ScrollView>
    <RelativeLayout
            android:id="@+id/chat_bar"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            >

        <EditText
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                />


    </RelativeLayout>
</RelativeLayout>
希望有所帮助。

编辑: 对于滚动行为,您可以存储listView ScrollListener

中显示的最后一项
 mList.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {

            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                lastItemPosition = firstVisibleItem+visibleItemCount;
            }
        });

然后通过在显示键盘时滚动到hist位置来设置最后一项

 mList.setSelectionFromTop(mLastItemPosition, mList.getHeight()-   mList.setSelectionFromTop(mLastItemPosition, mList.getHeight()-  mList.getAdapter().getView(mLastItemPosition,null,mList).getHeight());

答案 1 :(得分:0)

事实证明它很容易实现。当您使用listView作为列表时,请在初始化后添加以下行:

lv_chat.setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);
lv_chat.setStackFromBottom(true);

其中lv_chat是您的ListView对象!

第一行确保当新数据进入时,它会自动滚动到底部。

第二行强制列表视图从底部绘制。

这些都将涵盖您的所有要求。

这是一个和平滚动列表的帮助方法,以防你试图显式滚动:

public void scrollDown() {
    lv_chat.post(new Runnable() {
        @Override
        public void run() {
            lv_chat.setSelection(chatListAdapter.getCount() - 1);
        }
    });
}

希望它有所帮助! :)