在聊天应用程序中调整listview以及可扩展的edittext

时间:2015-01-06 19:44:14

标签: android android-layout android-listview

在我的聊天应用程序中,我有一个带有listview的布局(两个用户之间的聊天)和一个edittext输入,用于为同一个对话编写新消息。 第一个问题发生在用户点击输入时 - 弹出一个软键盘,但列表视图保持与以前相同的位置,而不是与edittext输入一起跳起并保持相同的间隔。 default view + keyboard up

第二个问题是当我解除键盘并返回到具有大量行的默认状态时,列表视图再次保持在同一位置并且edittext与其重叠。 enter image description here

我的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/main_bg"
android:gravity="right"
android:orientation="vertical" >
<include
    android:layout_alignParentTop="true"
    layout="@layout/actionbar_layout" />
<ListView
    android:id="@+id/lsvMessage"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:layout_marginBottom="0dp"
    android:layout_marginTop="50dp"
    android:background="@color/_transperant"
    android:divider="@null"
    android:dividerHeight="0dp">
</ListView>
<LinearLayout
    android:id="@+id/txtMsgLayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:orientation="vertical"
    android:background="@color/_transperant">
    <EditText
        android:id="@+id/txtMsg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:ems="10"
        android:hint="@string/btn_ask_hint"
        android:background="@drawable/edit_text_style"
        android:textColor="@color/_white"
        android:singleLine="true"
        android:textAlignment="viewStart"
        android:inputType="textMultiLine|textCapSentences|textNoSuggestions"
        android:layout_weight="1">
    </EditText>
    <RelativeLayout
        android:id="@+id/message_spinner_layout"
        style="@style/layout_fill_width"
        android:gravity="right"
        android:layout_weight="0">
        <Spinner
            android:id="@+id/message_lng_spinner"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_margin="10dp"
            android:gravity="right"
            android:paddingLeft="10dp"/>
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:gravity="right"
            android:background="@drawable/spinner_setting"
            android:layout_alignBottom="@id/message_lng_spinner"
            android:layout_marginBottom="12dp"
            android:layout_marginRight="20dp" />
    </RelativeLayout>
    <Button
        android:id="@+id/btnSend"
        style="@style/submit_button_style"
        android:text="@string/btnSend"
        android:background="@drawable/submit_button"
        android:layout_weight="0"/>
    </LinearLayout>
</RelativeLayout>

我尝试以编程方式修复它并计算edittext布局的高位以相应地移动listview但它没有工作。

final View activityRootView = 
((ViewGroup)findViewById(android.R.id.content)).getChildAt(0);
final View msgLayout = (ViewGroup)findViewById(R.id.txtMsgLayout);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener
(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
      Rect r = new Rect();
      activityRootView.getWindowVisibleDisplayFrame(r);
      int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
          if (heightDiff > 100) {
                scrollMyListViewToBottom();
          } else {
              int heighListview = msgLayout.getHeight();
              ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)     
              lsvMessage.getLayoutParams();
              params.setMargins(0,50,0,heighListview);
              lsvMessage.setLayoutParams(params);
          }
        }
    });

我可以使用正确标记的布局或代码来修复它吗?

1 个答案:

答案 0 :(得分:0)

我有同样的问题。我已经尝试了stackoverflow中的所有答案,但没有任何最终的解决方案。

我从谷歌原生消息应用程序中找到了解决方案: ComposeMessageActivity layout

ComposeMessageActivity这里有一个方法:&#34; smoothScrollToEnd &#34;

并且有一个MessageListView.java类用于检测onSizeChanged。