Android adjustpan not working after the first time

12,558

Solution 1

subclassed EditText and overridden the method onKeyPreIme(int keyCode, KeyEvent event) like this:

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

Now when the back key is pressed, the EditText lost the focus. Then tapping it again adjustpan will work.

Solution 2

This may seem a bit silly but I ran into this problem when I set the property gravity of my EditText to either 'center_horizontal' or 'center'. The same problem occurs when using textAlignment 'center'. Remove it and you won't run into the problem of the keyboard hiding the EditText the second time (and subsequent ones) when the keyboard comes out.

Solution 3

The problem you're experiencing is now a known platform bug as described here: https://code.google.com/p/android/issues/detail?id=182191

The fix is not backported and so will not take effect until Android N. Until Android N is your minimum SDK, the following solution is a workaround.

You can create a custom class extending EditText and override the method onKeyPreIme(int keyCode, KeyEvent event) like this:

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

You should also ensure a higher level layout has the ability to be focused so the EditText's focus may be cleared successfully. The following attributes may work for you:

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

Now when the back key is pressed, the EditText loses the focus. Then when you tap the button again, adjustpan will work as intended. (Posting as an answer since the edit was refused.)

Solution 4

For me overriding onKeyPreIme doesn't work. So I override dispatchKeyEventPreIme instead.

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

Solution 5

Here is the code I was originally using that ran into this problem:

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

When I removed the center gravity line from the EditText, the panning worked:

android:gravity="center"

I worked around it by wrapping the EditText in a FrameLayout and centering the entire EditText in the FrameLayout. The one issue it causes is that the EditText will be at least the width of the hinttext, so the first few characters/words typed won't be centered. This was fine for me but your mileage may vary :)

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

EDIT: this workaround breaks if the user is clicking on the very last word in the edittext. I'm now using the onKeyPreIme workaround

Share:
12,558

Related videos on Youtube

bilbo20
Author by

bilbo20

Updated on June 06, 2022

Comments

  • bilbo20
    bilbo20 almost 2 years

    My problem: starting from the second time the software keyboard is shown on the screen, it entirely hides my EditText.

    Attribute android:windowSoftInputMode="adjustPan" has been specified in the AndroidManifest.xml, but it works only the first time.

    I have the following layout:

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

    The "showOrHide" button shows/hides the "addListText"/"addTextListButton" combo.

    When the EditText is shown for the first time and I touch it, the soft keyboard appears on the screen and the "addListText"/"addTextListButton" combo is panned correctly. When I hide the keyboard and then show it again, the keyboard covers completely my addListText editbox!

    Any idea on what's going on? I'm testing it on Android 4.2.2.

    Please help! Thanks :-)

    edit: I've also tried to put the first LinearLayout inside a ScrollView but it doesn't work!

  • SudoPlz
    SudoPlz almost 10 years
    I'm using editText.clearfocus(), (without subclassing anything) and it does not seem to re adjustPan. The editText remains hidden below the soft keyboard.... What can I do to adjustPan on the fly?
  • dst
    dst over 9 years
    Weird but does not work for me. Maybe it's because the EditText is inside a fragment… will have to investigate :(
  • dst
    dst over 9 years
    Looks like I found the solution: there has to be at least one parent that is focusable, otherwise of course, the focus cannot be cleared ;)
  • Medo
    Medo over 9 years
    Amazing! And by amazing I mean it's amazing how apparently unrelated things can mess things up in Android.
  • DoDo
    DoDo almost 9 years
    Has anyone reported that to Google?
  • DoDo
    DoDo almost 9 years
    OK, I reported that to Google: code.google.com/p/android/issues/detail?id=182191
  • Suyash Dixit
    Suyash Dixit over 8 years
    Ladies and gentlemen we have a winner! Can't believe but this worked!
  • crysxd
    crysxd about 8 years
    If anyone stumbles across this: android:textAlignment="center" has the same negative effect
  • wuyi
    wuyi over 7 years
    in my case, set the gravity to "right" triggers this problem.
  • Borja
    Borja about 7 years
    @alopix it works if you put this to the parent view android:descendantFocusability="beforeDescendants" android:focusableInTouchMode="true"
  • KunalK
    KunalK almost 6 years
    Thank you chirag.
  • Matwosk
    Matwosk over 5 years
    You saved my day!