【问题标题】:Soft keyboard hides half of EditText软键盘隐藏了一半的 EditText
【发布时间】:2013-12-06 08:23:12
【问题描述】:

我有一个ListView,最后一个列表项包含EditText

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/contentLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="30dp"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignRight="@+id/messageEditText"
            android:layout_below="@+id/messageEditText"
            android:layout_marginRight="14dp"
            android:src="@drawable/test" />

        <EditText
            android:id="@+id/messageEditText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_toLeftOf="@+id/sendImageButton"
            android:ems="10"
            android:gravity="top"
            android:hint="@string/messageEditText"
            android:inputType="textMultiLine"
            android:minHeight="55dp"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:paddingTop="10dp" />

        <ImageButton
            android:id="@+id/sendImageButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@id/messageEditText"
            android:layout_alignParentRight="true"
            android:layout_alignTop="@id/messageEditText"
            android:adjustViewBounds="true"
            android:maxHeight="55dp"
            android:maxWidth="55dp"
            android:padding="12dp"
            android:scaleType="centerInside"
            android:src="@drawable/sendmessage" />

    </RelativeLayout>
</RelativeLayout>

EditText 的一半是隐藏的。我也无法滚动ListView。有什么解决办法吗?

【问题讨论】:

标签: android android-listview android-edittext android-softkeyboard


【解决方案1】:

解决方案是在 Manifest 中将 android:softInputMode 属性设置为 adjustResize,并将布局(不是列表项布局)放入 ScrollView。

【讨论】:

    【解决方案2】:

    我有一个类似的问题,然后我使用了android:windowSoftInputMode="adjustResize|stateHidden",正如提到的here..它对我来说效果很好..

    【讨论】:

    • 嗨@IgorGanapolsky .. stateHidden 设置将在用户进入新活动时隐藏软键盘(即使 EditText 控件获得焦点)。只有当用户单击编辑框控件时才会显示软键盘。
    【解决方案3】:

    从我作为 Android 开发人员的早期开始,我就一直在使用虚拟键盘。我很惊讶 Android 仍然没有为此提供优雅而清晰的解决方案。

    所以这里有一个解决方法,可以让你摆脱这个混乱。它可以在没有 ScrollView 解决方法或放弃全屏标志的情况下工作。

    1. 将这个很棒的库添加到您的 gradle 文件中:

    编译'net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:1.0.1'

    1. 确保您的活动具有以下键盘设置:

    android:windowSoftInputMode="adjustResize"

    1. 用垂直 LinearLayout 包裹你的 EditText 并添加一个可见性为 Gone 的视图:

      <com.ylimitapp.ylimitadmin.views.NormalFontEditText
          android:id="@+id/input_et"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:inputType="textCapSentences|textMultiLine"
          android:imeOptions="actionSend"
          android:paddingStart="20dp"
          android:paddingEnd="40dp"
          android:paddingTop="10dp"
          android:maxHeight="120dp"
          android:adjustViewBounds= "true"
          android:scrollHorizontally="false"
          android:textColorHint="#7b7b7b"
          android:hint="@string/type_your_message"
          android:background="@drawable/msg_inputfield_bg"
          android:textColor="@color/black_text_color"
          android:textSize="15.33sp"
          />
      
          <View
              android:id="@+id/keyboard_view"
              android:layout_width="match_parent"
              android:layout_height="20dp"
              android:visibility="gone"
              />
      
      </LinearLayout>
      
    2. 计算屏幕大小,以便计算推送 EditText 的视图高度:

      private void storeScreenHeightForKeyboardHeightCalculations() {
                  Rect r = new Rect();
                  View rootview = getActivity().getWindow().getDecorView(); 
                  rootview.getWindowVisibleDisplayFrame(r);
                  mOriginalScreenHeight = r.height();
      
                  Rect rectangle = new Rect();
                  Window window = getActivity().getWindow();
                  window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
                  int statusBarHeight = rectangle.top;
                  int contentViewTop =
                          window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
                  int titleBarHeight= contentViewTop - statusBarHeight;
      
                  if (titleBarHeight == 0) {
                      mOriginalScreenHeight -= (24 * Utils.getDensity(getContext()));
                  }
              }
      
      1. 为键盘打开和关闭事件添加监听器,然后在运行时设置 EditText 下方的 View 高度,以便我们在任何设备和自定义键盘上正确设置高度。然后只需在键盘打开时使其可见:
    private void addkeyBoardlistener() {
               KeyboardVisibilityEvent.setEventListener(
                                getActivity(),
                                new KeyboardVisibilityEventListener() {
                                    @Override
                                    public void onVisibilityChanged(boolean isOpen) {
                                        if (isOpen) {
                                            Rect r = new Rect();
                                            View rootview = getActivity().getWindow().getDecorView(); // this = activity
                                            rootview.getWindowVisibleDisplayFrame(r);
                                            int keyboardHeight = (mOriginalScreenHeight - r.height());
                                            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) keyboard_view.getLayoutParams();
                                            params.height = (int) ((keyboardHeight + 5 * Utils.getDensity(getContext())));
                                            keyboard_view.setLayoutParams(params);
                                            keyboard_view.setVisibility(View.VISIBLE);
                                        } else {
                                            keyboard_view.setVisibility(View.GONE);
                                        }
                                    }
                                });
                    }
    

    这是结果:

    【讨论】:

      【解决方案4】:

      在窗口启动时禁用键盘

      this .getWindow().setSoftInputMode(WindowManager.LayoutParams. SOFT_INPUT_STATE_ALWAYS_HIDDEN );
      

      【讨论】:

        【解决方案5】:

        在 Manifest 中为 Activity 元素设置 android:softInputMode 属性。

        请参阅Manifest documentation 以获取有效值及其效果的完整列表。您特别感兴趣的可能是adjustPanadjustResize

        【讨论】:

        • @Tanis.7x 你不能同时使用adjustPanadjustResize
        • 我从来没有说过要同时使用两者——我提到了两者,因为根据所需的最终行为,任何一个都可能适用。您应该查看两者的文档并选择提供所需行为的文档。
        【解决方案6】:

        像这样在清单中添加这个:

        <activity
            android:name="your_activity_name"
            android:windowSoftInputMode="adjustResize"
            android:theme="@style/Theme.AppCompat.DayNight.NoActionBar" />
        

        然后在你的布局和editText中添加paddingBottom="20dp"

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-05-22
          • 1970-01-01
          • 2014-12-13
          • 1970-01-01
          • 1970-01-01
          • 2012-02-18
          • 1970-01-01
          相关资源
          最近更新 更多