2012-01-08 23 views
8

Tengo una actividad para editar texto con una barra superior en una vista EditText en modo multilínea dentro de una vista de desplazamiento. En la parte inferior otra vista con 2 botones. Lo que quería lograr es cuando edite el texto que la barra inferior estaría debajo del teclado. Eso es fácil usando android: windowSoftInputMode = "adjustPan" en el manifiesto. El problema es si el texto de edición se vuelve lo suficientemente grande con varias líneas, al editar la barra superior desaparece. Esto solo ocurre cuando se usa el modo adjustPan. Pero lo peor y creo que es un error, es cuando el cursor está al final de la vista del texto de edición y se desplaza hacia arriba usando el joystick D-Pad, todo el diseño se tira hacia la parte superior.Android EditText Multiline con SoftInputMode adjustPan

Esta es la pantalla sin foco en el EditarTexto: http://i.stack.imgur.com/pFadV.png

Cuando el error se produce con el movimiento en sentido vertical, esto sucede: http://i.stack.imgur.com/eS8PP.png

Mi diseño es el siguiente:

<?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:background="@color/BackgroundGray" 
    android:gravity="top|center" 
    android:orientation="vertical" 
    android:windowSoftInputMode="adjustPan" > 

    <RelativeLayout 
     android:id="@+id/top_bar" 
     android:layout_width="fill_parent" 
     android:layout_height="45dip" 
     android:layout_alignParentTop="true" 
     android:background="@drawable/top_bar" 
     android:focusable="true" 
     android:focusableInTouchMode="true" > 

     <ImageView 
      android:id="@+id/bar_item_priority" 
      android:layout_width="4dip" 
      android:layout_height="34dip" 
      android:layout_alignParentLeft="true" 
      android:layout_centerVertical="true" 
      android:contentDescription="@string/priority" /> 

     <EditText 
      android:id="@+id/bar_title" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layout_marginLeft="6dip" 
      android:background="@android:color/transparent" 
      android:fadingEdge="vertical" 
      android:gravity="center_vertical|left" 
      android:hint="@string/default_title" 
      android:inputType="text|textCapSentences" 
      android:paddingLeft="10dip" 
      android:textColor="#f3f3f3" 
      android:textColorHint="#20ffffff" 
      android:textSize="20dip" 
      android:textStyle="bold" > 
     </EditText> 
    </RelativeLayout> 

    <View 
     android:id="@+id/main_top_bar_shadow" 
     android:layout_width="fill_parent" 
     android:layout_height="1dip" 
     android:layout_below="@+id/top_bar" 
     android:background="@color/TopBarShadow" /> 

    <LinearLayout 
     android:id="@+id/meta_bar" 
     android:layout_width="fill_parent" 
     android:layout_height="25dip" 
     android:layout_below="@+id/main_top_bar_shadow" 
     android:background="#313435" 
     android:descendantFocusability="blocksDescendants" > 

     <TextView 
      android:id="@+id/meta_date_modified" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:gravity="center_vertical|left" 
      android:paddingLeft="10dip" 
      android:paddingRight="10dip" 
      android:paddingTop="6dip" 
      android:shadowColor="#1d1d1d" 
      android:shadowDx="1" 
      android:shadowDy="1" 
      android:shadowRadius="2" 
      android:text="@string/default_date" 
      android:textColor="#9d9d9d" 
      android:textSize="12dip" 
      android:textStyle="bold" > 
     </TextView> 
    </LinearLayout> 

    <ScrollView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_above="@+id/bottom_bar" 
     android:layout_below="@+id/meta_bar" 
     android:fillViewport="true" 
     android:scrollbarSize="2dip" 
     android:scrollbarThumbHorizontal="@drawable/scrollbar" 
     android:scrollbarThumbVertical="@drawable/scrollbar" 
     android:scrollbars="vertical" > 

     <view 
      android:id="@+id/note" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="@android:color/transparent" 
      android:capitalize="sentences" 
      class="home.greven.notes.NoteEditor$LinedEditText" 
      android:fadingEdge="vertical" 
      android:gravity="top" 
      android:paddingBottom="8dip" 
      android:paddingLeft="11dip" 
      android:paddingRight="11dip" 
      android:paddingTop="8dip" 
      android:textSize="16sp" > 
     </view> 
    </ScrollView> 

    <View 
     android:id="@+id/bottom_bar_shadow" 
     android:layout_width="fill_parent" 
     android:layout_height="1dip" 
     android:layout_above="@+id/bottom_bar" 
     android:background="@color/TopBarShadow" 
     android:focusable="false" 
     android:focusableInTouchMode="false" /> 

    <LinearLayout 
     android:id="@+id/bottom_bar" 
     android:layout_width="fill_parent" 
     android:layout_height="40dip" 
     android:layout_alignParentBottom="true" 
     android:background="@drawable/bottom_buttons_bar" 
     android:descendantFocusability="blocksDescendants" > 

     <Button 
      android:id="@+id/bottom_bar_button_plaintext" 
      style="@style/NoteEditorButtonText" 
      android:layout_width="0.0dip" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical" 
      android:layout_margin="4dip" 
      android:layout_weight="0.5" 
      android:background="@drawable/small_blue_buttonstates" 
      android:text="@string/plain_text" /> 

     <Button 
      android:id="@+id/bottom_bar_button_checklist" 
      style="@style/NoteEditorButtonText" 
      android:layout_width="0.0dip" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical" 
      android:layout_margin="4dip" 
      android:layout_weight="0.5" 
      android:background="@drawable/small_gray_buttonstates" 
      android:onClick="toChecklist" 
      android:text="@string/checklist" /> 
    </LinearLayout> 

</RelativeLayout> 

Si yo use adjustResize en android: windowSoftInputMode todo funciona bien pero luego la barra inferior estará visible cuando se edite, algo que no quería que sucediera. Creo que este problema de desplazamiento es un error de Android. ¡Cualquier ayuda será muy apreciada!

Respuesta

2

Tengo el mismo problema con el botón en la parte inferior. Después de días de Google, encontré que esto se debe a la falta de

android:isScrollContainer="false" 

en ScrollView.

documento mención Android este

Ajuste este caso la vista servirá como contenedor de desplazamiento, meaing que se puede cambiar de tamaño para reducir el tamaño de su ventana en general por lo que no habrá espacio para un método de entrada.

Editar: Consulte igualmente la Answer

+0

Gracias por la respuesta, pero todavía lo hace el comportamiento extraño cuando se desplaza con el D-Pad. – greven

+0

En realidad, no he probado este código en D-pad, pero otros dispositivos no muestran lo mismo. –

+0

El único problema que tengo es cuando se desplaza con el D-Pad y solo si se muestra el teclado virtual. Aparte de eso, sí, esta solución funciona, pero la falla aún existe. – greven