2011-03-15 22 views
18

Tengo un típico listview con un edittext y un botón en la parte inferior de la actividad.Cómo evitar que Soft Keyboard cambie el tamaño de la imagen de fondo

Cuando hago clic en edittext, aparece el teclado virtual, puedo desplazar los elementos en el listview pero vuelve a mi imagen de fondo.

He intentado android:windowSoftInputMode="adjustResize" pero no hay ninguna diferencia.

He intentado android:windowSoftInputMode="adjustPan". La imagen no queda aplastada, todo el diseño cambia hacia arriba y pierdo la barra de título. Solo puedo desplazarme por la lista si los elementos de la lista superan el tamaño del diseño.

Básicamente, quiero mantener la barra de título, conservar la imagen de fondo sin cambiar el tamaño y permitir el desplazamiento de los elementos de la lista. ¿Alguien logró hacer esto? ¡Gracias!

Respuesta

3

No hay forma de evitar que el teclado virtual cambie el tamaño de una imagen de fondo.

Utilice este scaleType(matrix) y prepare una imagen adecuada.

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/RelativeLayoutchat" 
    > 

    <LinearLayout 
    android:orientation="horizontal" 
    android:gravity ="clip_horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_centerInParent="true"> 

    <ImageView 
     android:gravity ="clip_horizontal" 
     android:id="@+id/chat_bak_img" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:scaleType="matrix"> 
    </ImageView> 

    </LinearLayout> 

    <LinearLayout android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 

    <ListView 
     android:id="@+id/chat" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:transcriptMode="alwaysScroll" 
     android:divider="#000000" 
     android:clickable="false" 
     android:layout_weight="9" 
     android:cacheColorHint="#00000000"/> 



    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:layout_weight="1" 
     style="@android:style/ButtonBar" 
     android:gravity="center" 
     android:paddingLeft="3dip" 
     android:paddingTop="3dip" 
     android:paddingRight="3dip"> 
     <EditText 
      android:id="@+id/chatMsg" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:maxLines="5" 
      android:enabled="true" 
      android:textSize="17sp" 
      android:maxLength="150"/> 
     <Button 
      android:id="@+id/sendMsg" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:text="@string/send_withSpace" 
      android:layout_weight="4"/> 
    </LinearLayout> 

    </LinearLayout> 

</RelativeLayout> 
+0

Ehm, creo que adjustPan normalmente evita que el bg cambie de tamaño. – Ted

37

de vista de lista es necesario utilizar

android:isScrollContainer="false" 

y añadir esto a su actividad en manifest.xml

android:windowSoftInputMode="adjustPan" 
+6

No funcionó para mí. – mschonaker

+1

Meny solutions intentado, finalmente funcionó esto para SCROLL-VIEW. Muchas gracias. –

9

Ir a la AndroidManifest.xml y:

activity name="activityname" android:windowSoftInputMode="stateVisible|adjustPan" 
+1

Pero eso cambia el tamaño de la imagen bg –

19

Lo he intentado para soluciones para solvi ng este problema android: windowSoftInputMode = "adjustPan" hará que toda la pantalla cambie con el teclado. Generalmente tenemos un título de la pantalla en la parte superior. Al usar esta bandera, también saldrá del área visible, lo que hará que la experiencia del usuario sea mala. Yo uso android:windowSoftInputMode="adjustResize" Esto cambiará el tamaño de toda la pantalla, pero causará el mismo problema @Maurice estado en la pregunta.

Así que aquí es mi solución final:

en el manifiesto

android:windowSoftInputMode="adjustResize|stateAlwaysHidden" 

En XML

Dont Conjunto cualquier fondo here.And mantener su vista bajo ScrollView

en Java

Es necesario configurar el fondo de pantalla:

getWindow().setBackgroundDrawableResource(R.drawable.bg_wood) ; 
+2

+1 Esta es la respuesta correcta si desea que sus elementos cambien de tamaño, mientras que su fondo se mantiene como está. Esta respuesta merece más atención. – Levit

+1

¡Impresionante! ¡Buena respuesta! – gonzalomelov

+0

ans asombroso, obtuve la solución a través de estos ... –

1

tengo el mismo problema con imageview cambiar el tamaño, mientras que el teclado hasta que he resuelto con el androide manifiesta: windowSoftInputMode = "adjustPan" y que sigue es el ejemplo de diseño en mi caso

i.e frg_write_social:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/frg_writeyourpost_ll_main" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fillViewport="true" 
android:fitsSystemWindows="true" 
android:isScrollContainer="false" 
android:scrollbars="none" > 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <RelativeLayout 
     android:id="@+id/frg_writeyourpost_rl_top" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/frg_writeyourpost_ll_bottum" 
     android:layout_alignParentTop="true" 
     android:minHeight="400dip" > 

     <ImageView 
      android:id="@+id/frg_writyourpost_iv" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_centerInParent="true" 
      android:adjustViewBounds="true" 
      android:scaleType="fitXY" /> 
    </RelativeLayout> 

    <LinearLayout 
     android:id="@+id/frg_writeyourpost_ll_bottum" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:orientation="vertical" 
     android:padding="10dp" > 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="10dp" 
      android:layout_marginTop="10dp" 
      android:background="@android:color/white" 
      android:gravity="center" 
      android:orientation="vertical" 
      android:padding="10dp" > 

      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginLeft="10dp" 
       android:layout_marginRight="10dp" 
       android:gravity="center" 
       android:text="Write your post" 
       android:textColor="#727F8D" 
       android:textSize="10sp" /> 

      <com.example.views.CustomEditText 
       android:id="@+id/frg_writeyourpost_et_message" 
       android:layout_width="match_parent" 
       android:layout_height="@dimen/slide_image" 
       android:layout_marginLeft="10dp" 
       android:layout_marginRight="10dp" 
       android:background="@null" 
       android:inputType="textMultiLine" 
       android:maxHeight="@dimen/slide_image" 
       android:maxLines="3" 
       android:textSize="11sp" > 
      </com.example.views.CustomEditText> 

      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center" 
       android:layout_marginLeft="10dp" 
       android:layout_marginRight="10dp" 
       android:orientation="horizontal" > 

       <TextView 
         android:id="@+id/frg_writeyourpost_tv_totalcharacter" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:gravity="center" 
        android:text="0" 
        android:textColor="#727F8D" 
        android:textSize="8sp" /> 

       <TextView 
       android:id="@+id/frg_writeyourpost_tv_characterLeft" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginLeft="5dp" 
        android:gravity="center" 
        android:text="character" 
        android:textColor="#727F8D" 
        android:textSize="8sp" /> 
      </LinearLayout> 
     </LinearLayout> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:orientation="horizontal" > 

      <RadioGroup 
       android:id="@+id/frg_writepost_fbtw_rggroup" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" > 

       <RadioButton 
        android:id="@+id/frg_writepost_rb_facebook" 
        android:layout_width="0dip" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:background="@drawable/fb_check_selector" 
        android:button="@android:color/transparent" 
        android:gravity="center" 
        android:padding="10dip" 
        android:text="@string/post_for_facebook"/> 

       <View 
        android:layout_width="5dip" 
        android:layout_height="match_parent" 
        android:background="@android:color/transparent"/> 

       <RadioButton 
        android:id="@+id/frg_writepost_rb_twitter" 
        android:layout_width="0dip" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:background="@drawable/tw_check_selector" 
        android:button="@android:color/transparent" 
        android:gravity="center" 
        android:padding="10dip" 
        android:text="@string/post_for_twitter"/> 
      </RadioGroup> 
     </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 

si no es posible cargar la imagen de forma dinámica puede cambiar el tamaño de imagen con picaaso mientras que la carga en imageview

1

Uso ImageView con fill_parent y centerCrop atributos en RelativeLayout. Me gusta esto;

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 
    <ImageView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:src="@drawable/yazisma_arka_plan" 
     android:scaleType="centerCrop" 
     /> 
    <ListView 
     android:id="@+id/messages_view" 
     android:layout_width="fill_parent"... 
3

Uso android:windowSoftInputMode="adjustResize" y simplemente envolver su ImageView de fondo en un ScrollView.

<ScrollView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:scrollbars="none" 
    android:overScrollMode="never"> 
    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
</ScrollView> 
+0

Softlion

0

Er, déjame ver ... primero las fotos!

View before touched View after touched El archivo de disposición act_login.xml.

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@drawable/login_bkgd" 
    android:orientation="vertical" 
    android:paddingLeft="25dp" 
    android:paddingRight="25dp" 
    > 

    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:cacheColorHint="#0fff" 
     android:scrollbars="none" 
     android:listSelector="#0fff" 
     android:divider="#0fff" 
     android:dividerHeight="0dp" 
     android:isScrollContainer="true" 
     /> 
    <!--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!--> 
    <!--android:isScrollContainer="true"--> 
    <!--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!--> 

    <LinearLayout 
     android:id="@+id/loginItem" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     > 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:orientation="vertical" 
      > 

      <ImageView 
       android:id="@+id/loginLogo" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_marginBottom="35dp" 
       android:layout_marginTop="35dp" 
       android:scaleType="fitCenter" 
       android:src="@drawable/logo" 
       /> 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:gravity="center" 
       android:paddingBottom="35dp" 
       > 

       <View 
        android:layout_width="0dp" 
        android:layout_height="1px" 
        android:layout_weight="1" 
        android:background="#Ffff" 
        /> 

       <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginLeft="6dp" 
        android:layout_marginRight="6dp" 
        android:text="WELCOME" 
        android:textColor="#Ffff" 
        android:textSize="14sp" 
        /> 

       <View 
        android:layout_width="0dp" 
        android:layout_height="1px" 
        android:layout_weight="1" 
        android:background="#Ffff" 
        /> 
      </LinearLayout> 
     </LinearLayout> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" 
      > 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="50dp" 
       android:background="@drawable/login_et_long" 
       android:gravity="center" 
       android:paddingLeft="10dp" 
       android:paddingRight="10dp" 
       > 

       <TextView 
        android:layout_width="60dp" 
        android:layout_height="wrap_content" 
        android:background="@null" 
        android:text="账号:" 
        android:textColor="#Ffff" 
        android:textSize="16sp" 
        /> 

       <EditText 
        android:id="@+id/loginUsername" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:background="@null" 
        android:hint="请输入手机号" 
        android:imeOptions="actionNext" 
        android:inputType="text" 
        android:singleLine="true" 
        android:textColor="#F000" 
        android:textSize="16sp" 
        /> 
      </LinearLayout> 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="50dp" 
       android:layout_marginBottom="45dp" 
       android:layout_marginTop="10dp" 
       android:background="@drawable/login_et_long" 
       android:gravity="center" 
       android:paddingLeft="10dp" 
       android:paddingRight="10dp" 
       > 

       <TextView 
        android:layout_width="60dp" 
        android:layout_height="wrap_content" 
        android:background="@null" 
        android:text="密码:" 
        android:textColor="#Ffff" 
        android:textSize="16sp" 
        /> 

       <EditText 
        android:id="@+id/loginPassword" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:background="@null" 
        android:hint="请输入密码" 
        android:imeOptions="actionGo" 
        android:inputType="textPassword" 
        android:singleLine="true" 
        android:textColor="#F000" 
        android:textSize="16sp" 
        /> 
      </LinearLayout> 

      <TextView 
       android:id="@+id/login" 
       android:layout_width="match_parent" 
       android:layout_height="50dp" 
       android:background="@drawable/login_button" 
       android:gravity="center" 
       android:padding="10dp" 
       android:text="@string/str_login" 
       android:textColor="#Ffff" 
       android:textSize="19sp" 
       /> 
     </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 

Los códigos Java relacionados.

EditText etUsername, etPassword; 
EditText etFocus; 
ViewGroup base; 
int mSelection; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    base=(ViewGroup)getLayoutInflater().inflate(R.layout.act_login, null); 
    setContentView(base); 
    getWindow().setBackgroundDrawable(base.getBackground()); 
    base.setBackground(null); 
    super.onCreate(savedInstanceState); 
} 

@Override 
protected void initViews() { 
    etUsername=(EditText)findViewById(R.id.loginUsername); 
    etPassword=(EditText)findViewById(R.id.loginPassword); 

    final ViewGroup item=(ViewGroup)findViewById(R.id.loginItem); 
    base.removeView(item); 
    final View[] items=new View[item.getChildCount()]; 
    for(int i=0; i<item.getChildCount(); i++) items[i]=item.getChildAt(i); 
    item.removeAllViews(); 

    ListView lv=(ListView)base.getChildAt(0); 
    lv.setAdapter(new BaseAdapter() { 
    public View getView(int i, View v, ViewGroup vg) { 
     if(etFocus!=null && getCurrentFocus()!=etFocus){ 
      etFocus.requestFocus(); 
      etFocus.setSelection(mSelection); 
      //etFocus=null; 
     } 
     return items[i]; 
    } 
    public int getCount() {return items.length;} 
    public Object getItem(int position) {return null;} 
    public long getItemId(int position) {return 0;} 
    }); 

    /*View.OnTouchListener listener=new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent e) { 
      if(e.getAction()!=MotionEvent.ACTION_UP) return false; 
      etFocus=(EditText)v; 
      mSelection=etFocus.getSelectionEnd(); 
      ZZ.z("_________________ mSelection="+mSelection); 
      return false; 
     } 
    }; 
    etUsername.setOnTouchListener(listener); 
    etPassword.setOnTouchListener(listener);*/ 

    View.OnFocusChangeListener listener1=new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if(!hasFocus){ 
       etFocus=(EditText)v; 
       mSelection=etFocus.getSelectionStart(); 
       ZZ.z("_________________ mSelection="+mSelection); 
      } 
     } 
    }; 
    etUsername.setOnFocusChangeListener(listener1); 
    etPassword.setOnFocusChangeListener(listener1); 
} 

La parte de AndroidManifest.

<activity 
     android:name=".ui.activity.ActLogin" 
     android:label="@string/str_login" 
     android:theme="@style/myTheme" 
     /> 
    <!--android:windowSoftInputMode="adjustResize"--> 

La parte del estilo.

<style name="myTheme" parent="@android:style/Theme.Light.NoTitleBar"> 
    <item name="android:windowTranslucentStatus">true</item> 
</style> 
0

He leído un montón de respuestas sobre el SO y se llevaron algunos de muchos para hacer mis trabajos de aplicaciones:

  1. Sin ScrollView en absoluto en mi activity_main.xml
  2. En AndroidManifest.xml añadido este atributo a la

    <activity android:name=".MainActivity"

etiqueta:

`android:windowSoftInputMode="adjustResize"` 
  1. En el interior MainActivity.javaonCreate() añadí getWindow().setBackgroundDrawableResource(R.drawable.app_bg);

Funciona para mí cuando las todas las demás respuestas completas He intentado didn 't. Si llegó hasta aquí, espero que funcione también para usted.

Cuestiones relacionadas