安卓adjustpan在第一次之后不起作用

44

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

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

我有以下布局:

 <?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 中,但不起作用!

8个回答

80

这可能听起来有点傻,但当我把EditText的属性重力(gravity)设置为“center_horizontal”或“center”时,遇到了这个问题。使用文本对齐(textAlignment)时也会出现相同的问题。移除它,第二次(以及后续次数)键盘弹出时就不会遇到键盘隐藏EditText的问题。


5
太棒了!我指的是令人惊讶的是,似乎不相关的事情可以在Android中搞砸一切。 - Medo
1
有人向谷歌报告了吗? - DoDo
7
好的,我已经向 Google 报告了:https://code.google.com/p/android/issues/detail?id=182191 - DoDo
女士们先生们,我们有一个获胜者!简直不敢相信,但这确实奏效了! - Suyash Dixit
2
如果有人偶然发现这个问题:android:textAlignment="center" 会产生同样的负面影响。 - crysxd
1
在我的情况下,将重力设置为“右侧”会触发此问题。 - wuyi

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会失去焦点。然后再次点击它,调整大小将起作用。


我正在使用editText.clearfocus()(无需子类化任何内容),但似乎它不会重新调整屏幕。editText仍然隐藏在软键盘下面... 我该怎么做才能动态地调整屏幕? - SudoPlz
4
奇怪,但对我没有用。也许是因为EditText在一个片段中...需要调查一下 :( - dst
5
看起来我找到了解决方案:必须至少有一个可以聚焦的父元素,否则当然无法清除焦点 ;) - dst
3
如果你将这段代码放在父视图中,它就能正常工作: android:descendantFocusability="beforeDescendants" android:focusableInTouchMode="true" - Borja
谢谢你,Chirag。 - KunalK

9
您遇到的问题现在已经是一个已知的平台错误,可以在此处找到相关描述: https://code.google.com/p/android/issues/detail?id=182191 该修复尚未回溯,因此直到 Android N 才会生效。如果您的最小 SDK 版本低于 Android N,则可以使用以下解决方法。
您可以创建一个继承 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将按预期工作。 (由于编辑被拒绝,所以发布为答案。)

1

这是我最初使用的代码,遇到了这个问题:

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

当我从EditText中删除重心线时,平移功能有效了:
android:gravity="center"

我通过将EditText放在FrameLayout中并将整个EditText居中来解决了这个问题。唯一的问题是EditText的宽度至少为hinttext的宽度,因此输入的前几个字符/单词不会居中。对我来说这没问题,但你的情况可能会有所不同 :)

<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>

编辑:如果用户在EditText中点击最后一个单词,此解决方法将会失效。我现在使用onKeyPreIme解决方法。


1

对我来说,重写 onKeyPreIme 无效。因此,我改为重写 dispatchKeyEventPreIme

@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
    if(event.getKeyCode() == KeyEvent.KEYCODE_BACK){
     clearFocus();
    }
    return super.dispatchKeyEventPreIme(event);
}

0
在EditText中,android:layout_gravity="center"会创建这种问题。如果您想让文本居中,则可以按照以下方式操作:
步骤1:对于布局
 <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>

步骤2:通过编程实现某些事情

 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();    
        }
    });

最终工作得非常好。我找到了这个调整软键盘的解决方案。


0
在Manifest文件中尝试了许多解决方案后,我通过以下方法解决了这个问题: 使用相对布局的adjustPan无效,
你的父布局必须是LinearLayout。
希望这能节省一些人的时间。

0
通常情况下,当我们按下返回按钮后,调整面板不起作用。尝试按照以下方式操作:(可应用于EditText、AutoCompleteTextView或任何其他表现不佳的视图)
 @Override
    public void onBackPressed() {
        editText.clearFocus();
        editText.setCursorVisible(false);
    }

希望能对某人有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接