Android adjustpan在第一次使用后无法正常工作

bil*_*o20 41 android android-layout android-softkeyboard android-edittext

我的问题:从第二次软件键盘显示在屏幕上开始,它完全隐藏了我的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>
Run Code Online (Sandbox Code Playgroud)

"showOrHide"按钮显示/隐藏"addListText"/"addTextListButton"组合.

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

对于发生了什么有什么想法?我在Android 4.2.2上测试它.

请帮忙!谢谢 :-)

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

dba*_*bar 81

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

  • 好的,我向Google报告了这个问题:https://code.google.com/p/android/issues/detail?id = 182191 (6认同)
  • 惊人!令人惊讶的是,我的意思是,令人惊讶的是,显然无关的东西会让Android中的东西变得混乱. (5认同)
  • 所有的好和工作,但我现在如何集中我的文字? (4认同)
  • 如果有人偶然发现这个:android:textAlignment ="center"具有相同的负面影响 (2认同)

Chi*_*hah 53

子类化EditText并覆盖方法onKeyPreIme(int keyCode,KeyEvent事件),如下所示:

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

现在,当按下后退键时,EditText会丢失焦点.然后再次点击它adjustpan将起作用.

  • 看起来我找到了解决方案:必须至少有一个可聚焦的父级,否则当然,焦点无法清除;) (5认同)
  • 奇怪,但对我不起作用.也许这是因为EditText在一个片段内......将不得不调查:( (4认同)
  • @alopix如果你把它放到父视图`android:descendantFocusability ="beforeDescendants"android:focusableInTouchMode ="true"它是有效的 (3认同)

col*_*ots 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);
}
Run Code Online (Sandbox Code Playgroud)

您还应该确保更高级别的布局能够被聚焦,以便可以成功清除EditText的焦点.以下属性可能适合您:

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
Run Code Online (Sandbox Code Playgroud)

现在,当按下后退键时,EditText将失去焦点.然后当您再次点击该按钮时,adjustpan将按预期工作.(自编辑被拒绝后发布作为答案.)