45

我的问题:从第二次在屏幕上显示软件键盘开始,它完全隐藏了我的 EditText。

android:windowSoftInputMode="adjustPan" 属性已在 AndroidManifest.xml 中指定,但仅在第一次有效。

我有以下布局:

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="464dp"
        android:gravity="top"
        android:orientation="vertical"
        android:paddingLeft="16dp"
        android:paddingRight="16dp" >

        <ListView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="10"
            android:background="#E3E3E2"
            android:gravity="top" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <EditText
                android:id="@+id/addListText"
                android:layout_width="0dp"
                android:layout_height="48dp"
                android:layout_weight="10"
                android:contentDescription="@string/addItemContentDescription"
                android:gravity="bottom|center_horizontal"
                android:inputType="textLongMessage"
                android:textColor="#E3E3E2"
                android:visibility="gone" />

            <ImageButton
                android:id="@+id/addTextListButton"
                android:layout_width="0dp"
                android:layout_height="48dp"
                android:layout_weight="1"
                android:layout_gravity="right"
                android:background="@android:color/transparent"
                android:contentDescription="@string/addItemButton"
                android:scaleType="fitCenter"
                android:src="@drawable/plus_add"
                android:visibility="gone" />
        </LinearLayout>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:gravity="bottom|center_horizontal"
        android:orientation="horizontal"
        android:paddingLeft="16dp"
        android:paddingRight="16dp" >

        <ImageButton
            android:id="@+id/syncListsButton"
            android:layout_width="64dp"
            android:layout_height="match_parent"
            android:src="@android:drawable/ic_popup_sync" />

        <ImageButton
            android:id="@+id/showOrHide"
            android:layout_width="64dp"
            android:layout_height="match_parent" />

        <ImageButton
            android:id="@+id/delListButton"
            android:layout_width="64dp"
            android:layout_height="match_parent"
            android:src="@android:drawable/ic_menu_delete" />
    </LinearLayout>
</LinearLayout>

“showOrHide”按钮显示/隐藏“addListText”/“addTextListButton”组合。

当第一次显示 EditText 并且我触摸它时,屏幕上出现软键盘,并且“addListText”/“addTextListButton”组合被正确平移。当我隐藏键盘然后再次显示时,键盘完全覆盖了我的 addListText 编辑框!

知道发生了什么吗?我正在 Android 4.2.2 上对其进行测试。

请帮忙!谢谢 :-)

编辑:我也尝试将第一个 LinearLayout 放在 ScrollView 中,但它不起作用!

4

8 回答 8

81

这可能看起来有点傻,但是当我将 EditText 的属性重力设置为“center_horizo​​ntal”或“c​​enter”时遇到了这个问题。使用 textAlignment 'center' 时也会出现同样的问题。删除它,当键盘出来时,您将不会遇到键盘第二次(以及后续)隐藏 EditText 的问题。

于 2014-09-24T12:34:54.133 回答
54

子类化 EditText 并重写 onKeyPreIme(int keyCode, KeyEvent event) 方法,如下所示:

   @Override
   public boolean onKeyPreIme(int keyCode, KeyEvent event)
   {
      if(keyCode == KeyEvent.KEYCODE_BACK)
        {
            clearFocus();
        }
   return super.onKeyPreIme(keyCode, event);
   }

现在当按下返回键时,EditText 失去了焦点。然后再次点击它,调整盘将起作用。

于 2013-04-09T07:51:05.190 回答
9

您遇到的问题现在是一个已知的平台错误,如下所述:https ://code.google.com/p/android/issues/detail?id=182191

该修复不会向后移植,因此在 Android N 之前不会生效。在 Android N 成为您的最低 SDK 之前,以下解决方案是一种解决方法。

您可以创建一个扩展 EditText 的自定义类并覆盖 onKeyPreIme(int keyCode, KeyEvent event) 方法,如下所示:

@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event)
{
   if(keyCode == KeyEvent.KEYCODE_BACK)
     {
         clearFocus();
     }
return super.onKeyPreIme(keyCode, event);
}

您还应该确保更高级别的布局能够获得焦点,以便可以成功清除 EditText 的焦点。以下属性可能对您有用:

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

现在当按下返回键时,EditText 失去焦点。然后,当您再次点击该按钮时,adjustpan 将按预期工作。(由于编辑被拒绝,因此作为答案发布。)

于 2016-04-12T19:09:43.823 回答
1

对我来说,压倒一切onKeyPreIme是行不通的。所以我改写dispatchKeyEventPreIme了。

@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
    if(event.getKeyCode() == KeyEvent.KEYCODE_BACK){
     clearFocus();
    }
    return super.dispatchKeyEventPreIme(event);
}
于 2016-10-05T16:18:12.457 回答
1

这是我最初使用的遇到此问题的代码:

    <EditText
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:gravity="center" />

当我从 EditText 中删除中心重心线时,平移工作:

android:gravity="center"

我通过将 EditText 包装在 FrameLayout 中并将整个 EditText 居中在 FrameLayout 中来解决它。它导致的一个问题是 EditText 将至少是提示文本的宽度,因此键入的前几个字符/单词不会居中。这对我来说很好,但你的里程可能会有所不同:)

<FrameLayout
    android:layout_width="250dp"
    android:layout_height="wrap_content">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" />
</FrameLayout>

编辑:如果用户单击编辑文本中的最后一个单词,则此解决方法会中断。我现在正在使用 onKeyPreIme 解决方法

于 2016-02-07T02:55:43.410 回答
0

在 EditTextandroid:layout_gravity="center"中创建此类问题。如果你想文本成为中心,那么你可以这样做

Step1:布局

 <LinearLayout
                android:id="@+id/linerPassword"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_toRightOf="@+id/imageView2"
                android:gravity="center">

                <EditText
                    android:id="@+id/editText2"
                    android:layout_width="wrap_content"
                    android:layout_height="40dp"
                    android:background="@null"
                    android:hint="*****"
                    android:layout_marginLeft="-40dp"
                    android:paddingLeft="10dp"
                    android:paddingRight="10dp"
                    android:inputType="textPassword"
                    android:textColor="@color/white"
                    android:textColorHint="@color/white"
                    android:textSize="18sp" />
            </LinearLayout>

step2:以编程方式进行一些事情

 linerUser.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(mETUserName, 0);
            mETUserName.requestFocus();    
        }
    });

最后工作得很好。我找到了调整软键盘的解决方案

于 2016-06-03T12:11:20.167 回答
0

通常,当我们第一次按下后退按钮时,调整平移不起作用尝试以下方式:-(可以为 EditText、AutoCompleteTextView 或任何其他行为不端的视图实现)

 @Override
    public void onBackPressed() {
        editText.clearFocus();
        editText.setCursorVisible(false);
    }

希望它可以帮助某人

于 2017-02-13T20:22:40.177 回答
0

在 Manifest 文件中尝试了许多解决方案后,我通过以下方式解决了,adjustPan 与相对布局不起作用,

您的父布局必须是 LinearLayout

希望这可以为人们节省一些时间。

于 2017-09-25T13:14:18.457 回答