Tengo una vista con un Edittext campo en la parte superior de un ImageView. Cuando el teclado viene quiero la ventana para cambiar el tamaño para que EditText ya no oculto por el teclado. En el archivo AndroidManifest me declaró android:windowSoftInputMode="adjustResize" y la pantalla es de tamaño pero el problema es que quiero que el ImageView para no ser re-tamaño.
Cómo puedo hacer que el ImageView afectados?

Podría inflar un diseño adicional con sólo el ImageView o el cambio de tamaño aún afectan?
Android: cambiar el tamaño de las partes sólo de vista con el teclado en pantalla

  • puedes publicar de captura de pantalla para que??
  • Creo que me voy a tener que escala o recortar la imagen cada vez que el teclado viene
  • tiene usted obtener solución o no?
InformationsquelleAutor pdfj | 2014-01-18

8 Comentarios

  1. 87

    La solución completa consiste en un par de puntos clave

    • Uso RelativeLayout, por lo que Views se puede configurar para que se superponen el uno al otro
    • Alinear el EditText con la parte inferior de la Windows utilizando android:layout_alignParentBottom="true"
    • Uso android:windowSoftInputMode="adjustResize" en su manifiesto, de modo que la parte inferior de la Window cambios cuando el teclado aparece (como se mencionó)
    • Poner el ImageView dentro de un ScrollView para que el ImageView puede ser mayor que el Window, y desactivar el desplazamiento en el ScrollView mediante ScrollView#setEnabled(false)

    Aquí está el archivo de diseño

    <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"
        tools:context="com.so3.MainActivity">
        <ScrollView
            android:id="@+id/scroll"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <ImageView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:adjustViewBounds="true"
                android:src="@drawable/stickfigures"/>
        </ScrollView>
        <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:background="@android:color/holo_blue_bright"
            android:text="Please enter text"
            android:textSize="40sp"
            android:gravity="center_horizontal"/>
    </RelativeLayout>

    Aquí está mi Actividad

    package com.so3;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.ScrollView;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ScrollView sv = (ScrollView)findViewById(R.id.scroll);
            sv.setEnabled(false);
        }
    }

    Mi AndroidManifest

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.so3" >
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.so3.MainActivity"
                android:windowSoftInputMode="adjustResize"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>

    Capturas de pantalla de mi solución

    Android: cambiar el tamaño de las partes sólo de vista con el teclado en pantalla
    Android: cambiar el tamaño de las partes sólo de vista con el teclado en pantalla

    • Lo que es un scrollview y desactivación de desplazamiento es la parte que me faltaba. Voy a intentar aplicar mañana.
    • Añadido un par de capturas de pantalla de mi equipo de trabajo de la aplicación. Buena suerte 🙂
    • ¿Qué acerca de Fragmento?
    • gracias bro, es de gran ayuda la respuesta
    • después de la búsqueda para más de un par de horas esto funciona bien con mí !
    • +1. Buena solución, pero setEnabled(false) de ScrollView no funciona para mí. He usado contenedor de ScrollView para desactivar el desplazamiento stackoverflow.com/a/5763815/1225669
    • Podría yo hacer lo mismo pero con 1 EditText + 1 Botón de debajo de ella ?
    • Yo tenía el mismo problema. Tomé esa respuesta y acaba de hacer un ScrollView que fue permanentemente bloqueado. Una de las ventajas de hacerlo de esa manera es que ya no tenemos que dar a nuestros ScrollView un id y una llamada de findViewById en nuestra actividad.
    • La adición de ImageView dentro de un Scrollview funciona como una magia.Gracias.
    • Pero, ¿y si el caso es width=’match_parent» y la imagen es pequeña,de esta manera imageview no es a pantalla completa y también para ponerlo en pantalla completa, añadiendo scrollview fillViewport está de nuevo haciendo que la imagen cambia de tamaño en el teclado de software pop-up, por favor ayuda.
    • upvote de imagen de elección
    • mi edición de texto es un fragmento entonces, ¿qué hacemos con ella?
    • Hey @BrianAttwell puede sugerencia esta pregunta stackoverflow.com/questions/37760544/…
    • No funciona si la pantalla está en modo de pantalla completa
    • ME HAS SALVADO!!! Necesitaba ser capaz de dejar mi actividad de tamaño variable para el control de FAB comportamiento cuando softInput teclado se muestra, pero también tenía un fondo conjunto que yo no podía permitir que se cambie de tamaño. En caso de que esto se aplica a cualquier persona en el futuro: he utilizado un RelativeLayout dentro de un ScrollView dentro de un CoordinatorLayout dentro de un DrawerLayout…y establecer un fondo para el RelativeLayout. La Fab está dentro de la CoordinatorLayout, obviamente, y ahora se mueve con el teclado, dejando el fondo afectado.

  2. 3

    La adición de ScrollView estaba haciendo mi imagen desplazable que yo quería evitar así que utiliza esta muestras-keyboardheight calculadora y onKeyboardHeightChanged a calcular la posición de la parte inferior Edittext sitúa por encima del Teclado y utiliza este indicador en el Manifiesto.

    android:windowSoftInputMode="adjustNothing|stateHidden"

    Aquí es KeyboardHeightProvider :

    import android.app.Activity;
    import android.content.res.Configuration;
    import android.graphics.Point;
    import android.graphics.Rect;
    import android.graphics.drawable.ColorDrawable;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewTreeObserver.OnGlobalLayoutListener;
    import android.view.WindowManager.LayoutParams;
    import android.widget.PopupWindow;
    /**
    * The keyboard height provider, this class uses a PopupWindow
    * to calculate the window height when the floating keyboard is opened and closed. 
    */
    public class KeyboardHeightProvider extends PopupWindow {
    /** The tag for logging purposes */
    private final static String TAG = "sample_KeyboardHeightProvider";
    /** The keyboard height observer */
    private KeyboardHeightObserver observer;
    /** The cached landscape height of the keyboard */
    private int keyboardLandscapeHeight;
    /** The cached portrait height of the keyboard */
    private int keyboardPortraitHeight;
    /** The view that is used to calculate the keyboard height */
    private View popupView;
    /** The parent view */
    private View parentView;
    /** The root activity that uses this KeyboardHeightProvider */
    private Activity activity;
    /** 
    * Construct a new KeyboardHeightProvider
    * 
    * @param activity The parent activity
    */
    public KeyboardHeightProvider(Activity activity) {
    super(activity);
    this.activity = activity;
    LayoutInflater inflator = (LayoutInflater) activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    this.popupView = inflator.inflate(R.layout.popupwindow, null, false);
    setContentView(popupView);
    setSoftInputMode(LayoutParams.SOFT_INPUT_ADJUST_RESIZE | LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
    parentView = activity.findViewById(android.R.id.content);
    setWidth(0);
    setHeight(LayoutParams.MATCH_PARENT);
    popupView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
    if (popupView != null) {
    handleOnGlobalLayout();
    }
    }
    });
    }
    /**
    * Start the KeyboardHeightProvider, this must be called after the onResume of the Activity.
    * PopupWindows are not allowed to be registered before the onResume has finished
    * of the Activity.
    */
    public void start() {
    if (!isShowing() && parentView.getWindowToken() != null) {
    setBackgroundDrawable(new ColorDrawable(0));
    showAtLocation(parentView, Gravity.NO_GRAVITY, 0, 0);
    }
    }
    /**
    * Close the keyboard height provider, 
    * this provider will not be used anymore.
    */
    public void close() {
    this.observer = null;
    dismiss();
    }
    /** 
    * Set the keyboard height observer to this provider. The 
    * observer will be notified when the keyboard height has changed. 
    * For example when the keyboard is opened or closed.
    * 
    * @param observer The observer to be added to this provider.
    */
    public void setKeyboardHeightObserver(KeyboardHeightObserver observer) {
    this.observer = observer;
    }
    /**
    * Get the screen orientation
    *
    * @return the screen orientation
    */
    private int getScreenOrientation() {
    return activity.getResources().getConfiguration().orientation;
    }
    /**
    * Popup window itself is as big as the window of the Activity. 
    * The keyboard can then be calculated by extracting the popup view bottom 
    * from the activity window height. 
    */
    private void handleOnGlobalLayout() {
    Point screenSize = new Point();
    activity.getWindowManager().getDefaultDisplay().getSize(screenSize);
    Rect rect = new Rect();
    popupView.getWindowVisibleDisplayFrame(rect);
    //REMIND, you may like to change this using the fullscreen size of the phone
    //and also using the status bar and navigation bar heights of the phone to calculate
    //the keyboard height. But this worked fine on a Nexus.
    int orientation = getScreenOrientation();
    int keyboardHeight = screenSize.y - rect.bottom;
    if (keyboardHeight == 0) {
    notifyKeyboardHeightChanged(0, orientation);
    }
    else if (orientation == Configuration.ORIENTATION_PORTRAIT) {
    this.keyboardPortraitHeight = keyboardHeight; 
    notifyKeyboardHeightChanged(keyboardPortraitHeight, orientation);
    } 
    else {
    this.keyboardLandscapeHeight = keyboardHeight; 
    notifyKeyboardHeightChanged(keyboardLandscapeHeight, orientation);
    }
    }
    /**
    *
    */
    private void notifyKeyboardHeightChanged(int height, int orientation) {
    if (observer != null) {
    observer.onKeyboardHeightChanged(height, orientation);
    }
    }
    public interface KeyboardHeightObserver {
    void onKeyboardHeightChanged(int height, int orientation);
    }
    }

    popupwindow.xml :

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/popuplayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent"
    android:orientation="horizontal"/>

    Aquí es MainActivity.java :

    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.view.ViewGroup;
    public class MainActivity extends AppCompatActivity  implements KeyboardHeightProvider.KeyboardHeightObserver {
    private KeyboardHeightProvider keyboardHeightProvider;
    private ViewGroup relativeView;
    private float initialY;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    keyboardHeightProvider = new KeyboardHeightProvider(this);
    relativeView = findViewById(R.id.bottomEditor);
    relativeView.post(() -> initialY = relativeView.getY());
    View view = findViewById(R.id.activitylayout);
    view.post(() -> keyboardHeightProvider.start());
    }
    @Override
    public void onKeyboardHeightChanged(int height, int orientation) {
    if(height == 0){
    relativeView.setY(initialY);
    relativeView.requestLayout();
    }else {
    float newPosition = initialY - height;
    relativeView.setY(newPosition);
    relativeView.requestLayout();
    }
    }
    @Override
    public void onPause() {
    super.onPause();
    keyboardHeightProvider.setKeyboardHeightObserver(null);
    }
    @Override
    public void onResume() {
    super.onResume();
    keyboardHeightProvider.setKeyboardHeightObserver(this);
    }
    @Override
    public void onDestroy() {
    super.onDestroy();
    keyboardHeightProvider.close();
    }
    }

    activity_main.xml :

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activitylayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
    android:id="@+id/imageView2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:adjustViewBounds="true"
    android:scaleType="fitCenter"
    />
    <RelativeLayout
    android:id="@+id/bottomEditor"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    >
    <EditText
    android:id="@+id/edit_message"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="4dp"
    android:layout_toStartOf="@+id/btn_send"
    android:hint="Add caption"
    android:paddingBottom="12dp"
    android:paddingLeft="8dp"
    android:paddingRight="8dp"
    android:paddingStart="8dp"
    android:paddingTop="12dp"
    />
    <ImageButton
    android:id="@+id/btn_send"
    android:layout_width="48dp"
    android:layout_height="48dp"
    android:layout_alignBottom="@+id/edit_message"
    android:layout_alignParentEnd="true"
    android:layout_alignParentRight="true"
    android:layout_marginEnd="4dp"
    android:layout_marginRight="4dp"
    app:srcCompat="@android:drawable/ic_menu_send"
    />
    </RelativeLayout>
    </RelativeLayout>

    P. S. : cálculo de la altura del Teclado se copia el código de siebeprojects

    Aquí está la demo de ejemplo de la aplicación de la aplicación.

    • Gracias, no puedo utilizar esto para trabajar en una pantalla completa de la actividad, pero he hecho algunos ajustes a su código, así que actúa ahora :).
    • Usted podría colocar ese código para que alguien pueda resultarle útil. 🙂
  3. 1
    final View activityRootView = findViewById(R.id.mainScroll);
    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(
    new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
    int heightView = activityRootView.getHeight();
    int widthView = activityRootView.getWidth();
    if (1.0 * widthView / heightView > 1) {
    Log.d("keyboarddddd      visible", "no");
    relativeLayoutForImage.setVisibility(View.GONE);
    relativeLayoutStatic.setVisibility(View.GONE);
    //Make changes for Keyboard not visible
    } else {
    Log.d("keyboarddddd      visible ", "yes");
    relativeLayoutForImage.setVisibility(View.VISIBLE);
    relativeLayoutStatic.setVisibility(View.VISIBLE);
    //Make changes for keyboard visible
    }
    }
    });
    • este código funciona realmente , voy a resolver este tipo de problema a través de este código por favor pruebe este código . Es muy útil para usted .
    • Hola miral, tengo un edittext en mi diseño, que se mueven en contacto, Mi problema es que cuando muevo de edición de texto de la parte superior de la pantalla y abra el teclado en ese momento de edición de texto no es visible se ha ido hasta cuando cambio de tamaño de pantalla, pero yo quiero que cuando la tecla de la junta abierto en ese momento de edición de texto en la parte superior del teclado, ¿tiene usted alguna idea? Gracias.
  4. 0

    Para mí, yo no quería asumir que los teclados de las alturas de una cierta medida. Independientemente de la opinión de su preocupado por hacer un onTouchListener y, a continuación, hacer esto:

        setOnTouchListener(new OnTouchListener()  {
    Runnable shifter=new Runnable(){
    public void run(){
    try {
    int[] loc = new int[2];                 
    //get the location of someview which gets stored in loc array
    findViewById(R.id.someview).getLocationInWindow(loc);
    //shift so user can see someview
    myscrollView.scrollTo(loc[0], loc[1]);   
    }
    catch (Exception e) {
    e.printStackTrace();
    }   
    }}
    };
    Rect scrollBounds = new Rect();
    View divider=findViewById(R.id.someview);
    myscollView.getHitRect(scrollBounds);
    if (!divider.getLocalVisibleRect(scrollBounds))  {
    //the divider view is NOT  within the visible scroll window thus we need to scroll a bit.
    myscollView.postDelayed(shifter, 500);
    }
    });

    //esencialmente hacemos un ejecutable que se desplaza a una nueva ubicación de algún punto de vista que DESEA que aparezca en la pantalla. ejecutar ejecutables que sólo si no es dentro de la scrollviews límites (no en la pantalla). De esta manera se desplaza el scrollview a la que hace referencia la vista (en mi caso ‘someview», el cual fue un divisor de línea).

    • Este no se ejecuta en el primer toque, en mi caso el segundo toque que la hace funcionar.
    • su, probablemente, su registro de la ontouchlistener o el suyo un punto de vista sobre el enfoque cambió de escucha de consumir el toque de eventos, etc. Yo tendría que ver el código.
  5. 0

    En mi opinión, la forma más sencilla de hacerlo es esta combinación de los dos cambios:

    android:windowSoftInputMode="adjustResize"

    en su AndroidManifest.xml

    +

    getWindow().setBackgroundDrawable(your_image_drawable);

    en su actividad en @onCreate() método

    Funciona para mí.

    • Es allí una manera de utilizar este método y, sin embargo, conservar la relación de aspecto de la imagen?
  6. 0

    La mejor solución es utilizar un DialogFragment

    De diálogo mostrar

    DialogFragment.show(getSupportFragmentManager(), DialogFragment.TAG);

    Pantalla completa

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new Dialog(getActivity(), R.style.MainDialog) { //set the style, the best code here or with me, we do not change
    @Override
    public void onBackPressed() {
    super.onBackPressed();
    getActivity().finish();
    }
    };
    return dialog;
    }

    Estilo

    <style name="MainDialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowFrame">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">false</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:background">@null</item>
    <item name="android:windowAnimationStyle">@null</item>
    </style>

    Diseño De La Actividad

    <?xml version="1.0" encoding="utf-8"?>
    <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"
    android:background="@color/black">
    <ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
    </RelativeLayout>

    De diálogo diseño de fragmento

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/transparent">
    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_alignParentBottom="true"
    android:layout_alignParentStart="true"
    android:background="@color/background_transparent_60"
    android:gravity="center_vertical">
    <EditText
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="@dimen/spacing_1_8dp"
    android:layout_marginLeft="@dimen/spacing_1_8dp"
    android:layout_marginRight="@dimen/spacing_1_8dp"
    android:layout_weight="1"
    android:hint="@string/comment_entry_hint"
    android:inputType="textMultiLine"
    android:maxLines="4"
    android:textColor="@color/white"
    android:textColorHint="@color/secondary_text_hint"
    android:textSize="@dimen/text_2_12sp" />
    <ImageView
    android:layout_width="@dimen/livestream_comment_height"
    android:layout_height="@dimen/livestream_comment_height"
    android:layout_margin="@dimen/spacing_1_8dp"
    android:src="@drawable/ic_send" />
    </LinearLayout>
    </RelativeLayout>
  7. 0

    La solución que funcionó para mí fue en AndroidManifest.xml en la actividad de la etiqueta acaba de poner

    android:windowSoftInputMode="stateHidden|adjustResize|adjustNothing"

    Conjunto de todos..Espero que esto funcionará para usted.

  8. -11
        final View activityRootView = findViewById(R.id.mainScroll);
    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(
    new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
    int heightView = activityRootView.getHeight();
    int widthView = activityRootView.getWidth();
    if (1.0 * widthView / heightView > 1) {
    Log.d("keyboarddddd      visible", "no");
    relativeLayoutForImage.setVisibility(View.GONE);
    relativeLayoutStatic.setVisibility(View.GONE);
    //Make changes for Keyboard not visible
    //relativeLayoutForImage.setVisibility(View.VISIBLE);
    //relativeLayoutStatic.setVisibility(View.VISIBLE);
    } else {
    Log.d("keyboarddddd      visible ", "yes");
    relativeLayoutForImage.setVisibility(View.VISIBLE);
    relativeLayoutStatic.setVisibility(View.VISIBLE);
    //Make changes for keyboard visible
    // relativeLayoutForImage.setVisibility(View.GONE);
    //relativeLayoutStatic.setVisibility(View.GONE);
    }
    }
    });

Dejar respuesta

Please enter your comment!
Please enter your name here