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

时间:2013-03-09 23:32:41

标签: android android-layout android-edittext android-softkeyboard

我的问题:从第二次软件键盘显示在屏幕上开始,它完全隐藏了我的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中,但它不起作用!

8 个答案:

答案 0 :(得分:80)

这看起来有点傻但是当我将EditText的属性重力设置为&#39; center_horizo​​ntal&#39;时,我遇到了这个问题。或者&#39; center&#39;。使用textAlignment&#39; center&#39;时会出现同样的问题。删除它,你不会遇到键盘出现时键盘隐藏EditText(以及后续的键盘)的问题。

答案 1 :(得分: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);
   }

现在,当按下后退键时,EditText会丢失焦点。然后再次点击它可以调整。

答案 2 :(得分:9)

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

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

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

@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将按预期工作。 (自编辑被拒绝后发布作为答案。)

答案 3 :(得分:1)

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

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

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

android:gravity="center"

我通过将EditText包装在FrameLayout中并将整个EditText居中于FrameLayout来解决这个问题。它导致的一个问题是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解决方法

答案 4 :(得分:1)

对我来说,覆盖onKeyPreIme不起作用。所以我改为覆盖dispatchKeyEventPreIme

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

答案 5 :(得分: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>

第二步:按程序编写一些东西

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

最后工作得很好。我找到了适用于调整softKeyboard的解决方案

答案 6 :(得分:0)

通常调整平移在第一次按下后退按钮后不起作用尝试按以下方式执行: - (可以针对EditText,AutoCompleteTextView或任何其他行为异常的视图实现)

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

希望它可以帮助某人

答案 7 :(得分:0)

在Manifest文件中尝试了很多解决方案后, 我在下面解决了 adjustPan with Relative布局不起作用,

您的父布局必须是LinearLayout

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