36

我的问题:从第二次开始,软件键盘显示在屏幕上,它完全隐藏我的EditText。Android调整第一次后不工作

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

回答

52

子类的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的焦点。然后再次点击它adjustpan将工作。

+0

谢谢,这对我有用! – bilbo20 2013-04-25 17:17:16

+0

真是个绝招。 – MKJParekh 2013-05-09 07:01:14

+0

tnx .. @ MKJParekh – 2013-05-09 07:02:12

76

这看起来有点愚蠢,但当我将EditText的属性重力设置为'center_horizo​​ntal'或'center'时,我遇到了这个问题。使用textAlignment'center'时会发生同样的问题。删除它,当键盘出来时,不会遇到键盘隐藏EditText的问题(以及后续的问题)。

+5

令人惊叹!令人惊奇的是,我的意思是,很明显无关的东西可能会在Android中搞砸。 – Medo 2014-12-23 13:58:54

+6

这真是一个荒谬的错误....谢谢你的实现,虽然... – Sakiboy 2015-02-19 20:30:46

+0

你救了我的命,谢谢 – jlopez 2015-02-24 15:14:46

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解决方法

8

现在您遇到的问题是,这里所描述的已知漏洞的平台:https://code.google.com/p/android/issues/detail?id=182191

的修补程序不回迁,因此将不会生效,直到Android的N.直到安卓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将按预期工作。 (作为回答,因为编辑被拒绝。)

0

在EditText android:layout_gravity="center"创建此类型的问题。通过编程

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

一些事情最后工作得非常好:如果你想文本成为中心,那么你可以做这样

第一步:对于布局

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

第二步。我发现这个调整softKeyboard的解决方案

1

对于我压倒onKeyPreIme不起作用。所以我改写dispatchKeyEventPreIme

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

这对我有效!谢谢!! – xbadal 2017-05-03 08:14:52

0

通常情况下,调整当我们按下后退按钮尝试这样做,下面的方式锅不发生后的第一次工作: - (可为的EditText,AutoCompleteTextView或其中任何行为不端其他视图实现)

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

希望它可以帮助别人

0

清单文件,尝试了许多解决方案后, 我解决它由以下, adjustPan与相对布局不工作,

您的父级布局必须是LinearLayout

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

相关问题