软键盘隐藏了一半的 EditText

Posted

技术标签:

【中文标题】软键盘隐藏了一半的 EditText【英文标题】:Soft keyboard hides half of 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_
    android:layout_
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/contentLayout"
        android:layout_
        android:layout_
        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_
            android:layout_
            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_
            android:layout_
            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_
            android:layout_
            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 soft keyboard covers edittext field的可能重复 我在设置 android:windowSoftInputMode="adjustResize|stateHidden" 并使用滚动视图后遇到了同样的问题。还有其他建议吗? [属性 android:windowSoftInputMode="adjustResize" 不适用于全屏活动,您必须删除活动全屏标志才能获得调整大小的优势。 ](***.com/a/42204350/3926264) 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

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

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

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

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

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

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

android:windowSoftInputMode="adjustResize"

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

    <com.ylimitapp.ylimitadmin.views.NormalFontEditText
        android:id="@+id/input_et"
        android:layout_
        android:layout_
        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_
            android:layout_
            android:visibility="gone"
            />
    
    </LinearLayout>
    

    计算屏幕大小,以便计算推送 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()));
                
            
    
      为键盘打开和关闭事件添加监听器,然后在运行时设置 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"

【讨论】:

以上是关于软键盘隐藏了一半的 EditText的主要内容,如果未能解决你的问题,请参考以下文章

显示软键盘时多行EditText半隐藏

Android - 隐藏EditText弹出的软键盘输入(SoftInput)

在android中点击EditText的时候会弹出软键盘,这时候如果想隐藏软键盘或者填完内容后点其他的地方直接隐藏

Android -- 打开时隐藏软键盘

如何隐藏安卓软键盘? [复制]

在片段替换上显示/隐藏 Android 软键盘