【问题标题】:Android: soft keyboard pushes up whole layout, need to resize the listviewAndroid:软键盘上推整个布局,需要调整列表视图的大小
【发布时间】:2014-05-28 08:18:32
【问题描述】:

我有一个全屏聊天布局,顶部有一个带有徽标的标题,然后是一个包含所有聊天消息的 listView,底部是 editText 和发送聊天消息的按钮。现在,当我单击 editText 时会发生什么,整个布局被向上推。我需要的是,带有徽标的标题始终保持在原位,并且 listView 会调整大小。

这不能解决问题:

android:windowSoftInputMode="adjustResize"

这两个都不是:

android:windowSoftInputMode="adjustPan"

也许是因为我有全屏布局?

一旦出现键盘,我需要找到一种不同的方法来调整我的 listView 的大小,有什么想法吗?提前致谢!

这是我的布局

<LinearLayout

    android:layout_width="match_parent"
    android:layout_height="70dp"
    android:background="@drawable/ss99_yellow_area_navigation_bar"
    android:baselineAligned="false"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/back"
        android:layout_width="45dp"
        android:layout_height="match_parent"
        android:layout_marginBottom="10dp"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="5dp"
        android:adjustViewBounds="true"
        android:clickable="true"
        android:src="@drawable/ss99_button_back" />

    <ImageView
        android:id="@+id/logo"
        android:layout_width="wrap_content"
        android:layout_height="75dp"
        android:layout_weight="1"
        android:adjustViewBounds="true"
        android:src="@drawable/ss99_logo_small" />

</LinearLayout>

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="45dp"
    android:layout_marginTop="-2dp"
    android:background="@drawable/ss9_yellow_bar_chat_new" >

    <TextView
        android:id="@+id/userOpponent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="5dp"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/userUser"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/userOpponent"
        android:layout_alignBottom="@+id/userOpponent"
        android:layout_alignParentRight="true"
        android:layout_marginRight="5dp"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />

</RelativeLayout>

    <ListView
        android:id="@+id/chatList"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:cacheColorHint="#00000000"
        android:divider="#00000000"
        android:listSelector="#00000000" 
     android:layout_weight="1"
      android:stackFromBottom="true"
        android:transcriptMode="alwaysScroll">
    </ListView>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:background="@drawable/ss9_yellow_area_for_bottom_and_chat_string" >

           <ImageView
                    android:id="@+id/field1"
                    android:layout_width="220dp"
                    android:layout_height="wrap_content"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentTop="true"
                    android:layout_gravity="center"
                    android:layout_marginLeft="20dp"
                    android:layout_marginTop="10dp"
                    android:adjustViewBounds="true"
                    android:scaleType="centerInside"
                    android:src="@drawable/ss1_field_big" />

                <EditText
                    android:id="@+id/chatEdit"
                    android:layout_width="200dp"
                    android:layout_height="wrap_content"
                    android:layout_alignBottom="@+id/field1"
                    android:layout_alignLeft="@+id/field1"
                    android:layout_alignTop="@+id/field1"
                    android:layout_marginBottom="3dp"
                    android:layout_marginLeft="10dp"
                    android:layout_marginTop="1dp"
                    android:background="@null"
                    android:inputType="textAutoCorrect|textAutoComplete"
                    android:textAppearance="?android:attr/textAppearanceMedium" >

                </EditText>

    <ImageView
        android:id="@+id/chatOk"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginBottom="5dp"
        android:adjustViewBounds="false"
        android:baselineAlignBottom="false"
        android:clickable="true"
        android:cropToPadding="false"
        android:scaleType="fitEnd"
        android:src="@drawable/ss4_button_go_small" />

    </RelativeLayout>

</LinearLayout>

【问题讨论】:

  • 在滚动视图中添加布局
  • 已经想到了,但是我的布局有一个列表视图,列表视图和滚动视图不能很好地结合在一起

标签: android android-layout android-listview


【解决方案1】:

尝试将其添加到 Manifest.xml 中的活动中

<activity
        android:windowSoftInputMode="stateVisible|adjustNothing">  
 </activity>

【讨论】:

  • 不是想要的效果,布局保持在其位置,但现在键盘始终可见并与editText重叠。你看不到你在输入什么
  • 是否可以在manifest文件中使用adjustNothing获取键盘高度?
【解决方案2】:

好的,所以我实际上自己解决了这个问题,但我认为这只不过是一个 hack,所以我可能会在稍后重新审视这个问题。但关键是它有效(在 Galaxy S4 上测试过)

我根据显示的 softKeyboard 的高度调整我的 listView 的大小,并在键盘消失后重新调整它的大小。

private static boolean keyboardHidden = true;
private static int reduceHeight = 0;
//...
//...
final View decorView = this.getWindow().getDecorView();
decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        Rect rect = new Rect();
        decorView.getWindowVisibleDisplayFrame(rect);

        int displayHeight = rect.bottom - rect.top;
        int height = decorView.getHeight();
        boolean keyboardHiddenTemp = (double)displayHeight / height > 0.8 ;
        int mylistviewHeight = mylistview.getMeasuredHeight();

        if (keyboardHiddenTemp != keyboardHidden) {                 
            keyboardHidden = keyboardHiddenTemp;

            if (!keyboardHidden) {      

                reduceHeight = height - displayHeight;

                LinearLayout.LayoutParams mParam = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,mylistviewHeight - reduceHeight); 
                mylistview.setLayoutParams(mParam);
                mylistview.requestLayout();

            } else {

                LinearLayout.LayoutParams mParam = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,mylistviewHeight + reduceHeight); 
                mylistview.setLayoutParams(mParam);
                mylistview.requestLayout();


            }
        }

    }
}); 

【讨论】:

  • 它飞离屏幕很远
【解决方案3】:

ScrollView 中添加您的布局,并在清单文件中添加android:windowSoftInputMode="adjustResize"

ListView 上设置OnTouchListener(),以便ScrollView 内的子视图并执行触摸操作。

 ListView lv = (ListView) findViewById(R.id.layout_lv);
 lv.setOnTouchListener(new OnTouchListener() {
    // Setting on Touch Listener for handling the touch inside ScrollView
    @Override
        public boolean onTouch(View v, MotionEvent event) {
       // Disallow the touch request for parent scroll on touch of child view
       v.getParent().requestDisallowInterceptTouchEvent(true);
       return false;
}
});

【讨论】:

  • 这种方法引发了其他一些问题,我的列表视图在滚动视图中折叠。我不确定我想走这条路
【解决方案4】:

将此添加到您的活动中

<activity
    android:windowSoftInputMode="adjustResize"
</activity>

但要做到这一点,请将listview的高度fill_parent

【讨论】:

    猜你喜欢
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    相关资源
    最近更新 更多