windowSoftInputMode = "ajustarResize" no funciona con acción translúcida / barra de navegación

129

Tengo problemas con la barra de acción / barra de navegación translúcida en el nuevo Android KitKat (4.4) y el windowSoftInputMode="adjustResize".

Cambiando normalmente el InputMode para ajustarResize, la aplicación debería cambiar su tamaño cuando se muestra el teclado ... ¡pero aquí no lo hará! Si elimino las líneas para el efecto transparente, el cambio de tamaño está funcionando.

Entonces, si el teclado está visible, mi ListView está debajo y no puedo acceder a los últimos elementos. (Solo ocultando el teclado manualmente)

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="XYZ"
android:versionCode="23"
android:versionName="0.1" >

<uses-sdk
    android:minSdkVersion="9"
    android:targetSdkVersion="19" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.XYZStyle" >
    <activity
        android:name="XYZ"
        android:label="@string/app_name"
        android:windowSoftInputMode="adjustResize" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

values-v19 / styles.xml

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

<style name="Theme.XYZStyle" parent="@style/Theme.AppCompat.Light">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
</style>

</resources>

fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ListView
    android:id="@+id/listView_contacts"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="false"
    android:divider="@null"
    android:dividerHeight="0dp"
    android:drawSelectorOnTop="true"
    android:fastScrollAlwaysVisible="true"
    android:fastScrollEnabled="true"
    android:paddingBottom="@dimen/navigationbar__height" >
</ListView>

</RelativeLayout>

¿Alguien ideas para arreglar esto?

fabianbru
fuente

Respuestas:

184

Te falta la siguiente propiedad:

android:fitsSystemWindows="true"

en la raíz RelativeLayoutdel fragmento de diseño .xml.

Actualizar:

El año pasado hubo una charla interesante de Chris Bane que explica en detalle cómo funciona esto:

https://www.youtube.com/watch?v=_mGDMVRO3iE

pablisco
fuente
55
Supongo que es algo con política de pantalla completa
Felix.D
1
¡Tu eres el hombre! Este problema me ocurrió solo en la versión Lollipop, y lo solucionó.
David
66
@ David Se nt fija, sin embargo, sigue rompiendo en el dispositivo de malvavisco, si se abre un cuadro de diálogo y luego intenta desplazarse softkeboard bloqueará el desplazamiento
Bytecode
55
Funciona, pero entra en conflicto con mi barra de herramientas y la personalización de la barra de estado
Ninja
2
funciona pero la barra de estado ya no es translúcida. Quiero que el diseño cubra toda la pantalla.
htafoya
34

Hay un informe de error relacionado aquí . He encontrado una solución que, a partir de pruebas limitadas, parece hacer el truco sin repercusiones. Agregue una implementación personalizada de su raíz ViewGroup(casi siempre estoy usando FrameLayout, así que esto es con lo que he probado) con la lógica a continuación. Luego, use este diseño personalizado en lugar de su diseño raíz y asegúrese de configurarlo android:fitsSystemWindows="true". Luego, puede llamar en getInsets()cualquier momento después del diseño (por ejemplo, agregar un OnPreDrawListener) para ajustar el resto de su diseño para tener en cuenta las inserciones del sistema, si lo desea.

import android.content.Context;
import android.graphics.Rect;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.FrameLayout;
import org.jetbrains.annotations.NotNull;

/**
 * @author Kevin
 *         Date Created: 3/7/14
 *
 * https://code.google.com/p/android/issues/detail?id=63777
 * 
 * When using a translucent status bar on API 19+, the window will not
 * resize to make room for input methods (i.e.
 * {@link android.view.WindowManager.LayoutParams#SOFT_INPUT_ADJUST_RESIZE} and
 * {@link android.view.WindowManager.LayoutParams#SOFT_INPUT_ADJUST_PAN} are
 * ignored).
 * 
 * To work around this; override {@link #fitSystemWindows(android.graphics.Rect)},
 * capture and override the system insets, and then call through to FrameLayout's
 * implementation.
 * 
 * For reasons yet unknown, modifying the bottom inset causes this workaround to
 * fail. Modifying the top, left, and right insets works as expected.
 */
public final class CustomInsetsFrameLayout extends FrameLayout {
    private int[] mInsets = new int[4];

    public CustomInsetsFrameLayout(Context context) {
        super(context);
    }

    public CustomInsetsFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomInsetsFrameLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public final int[] getInsets() {
        return mInsets;
    }

    @Override
    protected final boolean fitSystemWindows(@NotNull Rect insets) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            // Intentionally do not modify the bottom inset. For some reason, 
            // if the bottom inset is modified, window resizing stops working.
            // TODO: Figure out why.

            mInsets[0] = insets.left;
            mInsets[1] = insets.top;
            mInsets[2] = insets.right;

            insets.left = 0;
            insets.top = 0;
            insets.right = 0;
        }

        return super.fitSystemWindows(insets);
    }
}

Dado que fitSystemWindows ha quedado en desuso, consulte la respuesta a continuación para completar la solución.

Kevin Coppock
fuente
1
En realidad, SOFT_INPUT_ADJUST_PAN parece no ser ignorado de acuerdo con mi experiencia: moverá toda la pantalla hacia arriba, incluida la barra del sistema y el teclado de desplazamiento bajo una vista enfocada.
sealskej
Gracias, tiene razón sobre SOFT_INPUT_ADJUST_PAN. Usé esto en mi fragmento: getActivity (). GetWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Simon
Esa fue la única forma en que pude lograr ajustarResize para la actividad (necesaria para el desplazamiento de la vista al mostrar el teclado), fitSystemWindows configurado como verdadero para que el desplazamiento realmente suceda en> = Lollipop y tenga una barra de estado translúcida. Muchas gracias.
Lucas
esta es la solución real
martyglaubitz
Se necesita tiempo para mostrar y ocultar el teclado, incluso es necesario llevar el diseño hacia arriba. Alguna solución ?
Vanjara Sweta
28

La respuesta de @kcoppock es realmente útil, pero fitSystemWindows quedó en desuso en el nivel 20 de API

Entonces, desde API 20 (KITKAT_WATCH), debe anular onApplyWindowInsets

@Override
public final WindowInsets onApplyWindowInsets(WindowInsets insets) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
        return super.onApplyWindowInsets(insets.replaceSystemWindowInsets(0, 0, 0,
                insets.getSystemWindowInsetBottom()));
    } else {
        return insets;
    }
}
Victor91
fuente
¿En qué clase deberíamos anular esto?
Ben-J
@ Ben-J en una clase que extiende la clase original
Victor91
No tengo idea de por qué configura los elementos de la matriz mInsets mientras no se usa, pero funciona
Buckstabue
1
En lugar de la verificación de versión que puede usarViewCompat.setOnApplyWindowInsetsListener
repita el
No pude hacer que esto funcionara, pero reemplazarlo dispatchApplyWindowInsets(el mismo código) funcionó para mí
petter
11

Esto funcionó para mí tener una barra de estado translúcida y ajustarResize en fragmentos:

  1. Haga un RelativeLayout personalizado como @ Victor91 y @kcoppock dijeron.

  2. Use CustomRelativeLayout como diseño principal para su fragmento.

  3. Declarar tema con android: windowTranslucentStatus = true

  4. La actividad del contenedor debe declararse en Manifiesto con android: windowSoftInputMode = "ajustarResize" y usar el tema declarado

  5. ¡Por favor, utiliza fitsSystemWindows en el diseño de raíz fragmentado!

    public class CustomRelativeLayout extends RelativeLayout {
    
        private int[] mInsets = new int[4];
    
        public CustomRelativeLayout(Context context) {
            super(context);
        }
    
        public CustomRelativeLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
        }
    
        @Override
        public final WindowInsets onApplyWindowInsets(WindowInsets insets) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
                mInsets[0] = insets.getSystemWindowInsetLeft();
                mInsets[1] = insets.getSystemWindowInsetTop();
                mInsets[2] = insets.getSystemWindowInsetRight();
                return super.onApplyWindowInsets(insets.replaceSystemWindowInsets(0, 0, 0,
                        insets.getSystemWindowInsetBottom()));
            } else {
                return insets;
            }
        }
    }

Luego en xml,

<com.blah.blah.CustomRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:fitsSystemWindows="true">
</com.blah.blah.CustomRelativeLayout>
Germán
fuente
1
Esta es la mejor respuesta hasta ahora, y estoy buscando una solución en algún momento. Funciona perfectamente, pero debe agregar un poco de relleno adicional a su barra de herramientas, sin ella su barra de herramientas se superpondrá a la barra de estado
Paulina
¿Qué pasa con windowTranslucentNavigation? ¿Puedes ayudar con eso?
V-rund Puro-hit
10

Si desea personalizar las inserciones y está apuntando a un nivel de API> = 21, puede lograr esto sin tener que crear un grupo de vista personalizado. Simplemente configurando el fitsSystemWindowsrelleno, se aplicará a la vista de contenedor de forma predeterminada, lo que quizás no desee.

Las verificaciones de versión están integradas en este método y solo los dispositivos> = 21 ejecutarán el código dentro del lambda. Ejemplo de Kotlin:

ViewCompat.setOnApplyWindowInsetsListener(container) { view, insets ->
  insets.replaceSystemWindowInsets(0, 0, 0, insets.systemWindowInsetBottom).apply {
    ViewCompat.onApplyWindowInsets(view, this)
  }
}

Asegúrese de que su diseño todavía establezca la fitsSystemWindowsbandera; de lo contrario, no se llamará al oyente de inserciones de ventana.

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    />

Estas fuentes son útiles:

https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec https://medium.com/@azizbekian/windowinsets-24e241d4afb9

Victor Rendina
fuente
1
Este sigue siendo el mejor enfoque, ya que puede aplicar este es su BaseFragment, junto con view.fitsSystemWindows = truey simplemente funciona sin ningún cambio en los diseños XML reales o las subclases Ver.
Bogdan Zurac
5

Tuve el mismo problema, My Activity tenía un ScrollView como vista raíz y con la barra de estado translúcida activada, no cambió de tamaño correctamente cuando se mostró el teclado ... y consecuentemente, la pantalla no se desplazó ocultando las vistas de entrada.

Solución: Movió todo (diseño y lógica de actividad) dentro de un nuevo Fragmento. Luego cambió la Actividad para incluir solo este Fragmento. ¡Ahora todo funciona como se esperaba!

Este es el diseño de la actividad:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/contentView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true" />
araks
fuente
Funciona a las
mil maravillas
2

Basado en la solución alternativa de Joseph Johnson en Android Cómo ajustar el diseño en modo de pantalla completa cuando el teclado está visible

llama a esto onCreate()después setContentView()en tu actividad.

AndroidBug5497Workaround.assistActivity(this);

un poco diferente del original reemplazar return (r.bottom - r.top);con return r.bottom;encomputeUsableHeight()

por alguna razón, debo establecer mi fitsSystemWindowsatributo de actividad en false.

Esta solución me salvó. Funciona bien para mí. La esperanza puede ayudarte.

la clase de implementación es:

public class AndroidBug5497Workaround {

// For more information, see https://code.google.com/p/android/issues/detail?id=5497
// To use this class, simply invoke assistActivity() on an Activity that already has its content view set.

public static void assistActivity (Activity activity) {
    new AndroidBug5497Workaround(activity);
}

private View mChildOfContent;
private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;

private AndroidBug5497Workaround(Activity activity) {
    FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
    mChildOfContent = content.getChildAt(0);
    mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        public void onGlobalLayout() {
            possiblyResizeChildOfContent();
        }
    });
    frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
}

private void possiblyResizeChildOfContent() {
    int usableHeightNow = computeUsableHeight();
    if (usableHeightNow != usableHeightPrevious) {
        int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
        int heightDifference = usableHeightSansKeyboard - usableHeightNow;
        if (heightDifference > (usableHeightSansKeyboard/4)) {
            // keyboard probably just became visible
            frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
        } else {
            // keyboard probably just became hidden
            frameLayoutParams.height = usableHeightSansKeyboard;
        }
        mChildOfContent.requestLayout();
        usableHeightPrevious = usableHeightNow;
    }
}

private int computeUsableHeight() {
    Rect r = new Rect();
    mChildOfContent.getWindowVisibleDisplayFrame(r);
    return r.bottom;
}

}
Loyea
fuente
0

AndroidBug5497Workaround.java se encarga de la pérdida de memoria. necesita debajo del código

getViewTreeObserver().removeOnGlobalLayoutListener(listener);

Mi muestra usando RxJava que automáticamente llama a removeOnGlobalLayoutListener () cuando onPause () en el ciclo de vida de Activity

public class MyActivity extends RxAppCompatActivity {
    // ...

protected void onStart(){
    super.onStart();

        TRSoftKeyboardVisibility
            .changes(this) // activity
            .compose(this.<TRSoftKeyboardVisibility.ChangeEvent>bindUntilEvent(ActivityEvent.PAUSE))
            .subscribe(keyboardEvent -> {
                FrameLayout content = (FrameLayout) findViewById(android.R.id.content);
                View firstChildView = content.getChildAt(0);
                firstChildView.getLayoutParams().height = keyboardEvent.viewHeight();
                firstChildView.requestLayout();

                // keyboardEvent.isVisible      = keyboard visible or not
                // keyboardEvent.keyboardHeight = keyboard height
                // keyboardEvent.viewHeight     = fullWindowHeight - keyboardHeight
            });
   //...
}





package commonlib.rxjava.keyboard;

import android.app.Activity;
import android.view.View;
import android.widget.FrameLayout;
import kr.ohlab.android.util.Assert;
import rx.Observable;

public class TRSoftKeyboardVisibility {

    public static Observable<ChangeEvent> changes(Activity activity) {
        Assert.notNull(activity, "activity == null");
        FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
        View childOfContent = content.getChildAt(0);
        return Observable.create(
            new TRSoftKeyboardVisibilityEventOnSubscribe(childOfContent));
    }

    public static final class ChangeEvent {
        private final int keyboardHeight;
        private final boolean visible;
        private final int viewHeight;

        public static ChangeEvent create(boolean visible, int keyboardHeight,
            int windowDisplayHeight) {
            return new ChangeEvent(visible, keyboardHeight, windowDisplayHeight);
        }

        private ChangeEvent(boolean visible, int keyboardHeight, int viewHeight) {
            this.keyboardHeight = keyboardHeight;
            this.visible = visible;
            this.viewHeight = viewHeight;
        }

        public int keyboardHeight() {
            return keyboardHeight;
        }

        public boolean isVisible() {
            return this.visible;
        }

        public int viewHeight() {
            return viewHeight;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (!(o instanceof ChangeEvent)) return false;

            ChangeEvent that = (ChangeEvent) o;

            if (keyboardHeight != that.keyboardHeight) return false;
            if (visible != that.visible) return false;
            return viewHeight == that.viewHeight;
        }

        @Override
        public int hashCode() {
            int result = keyboardHeight;
            result = 31 * result + (visible ? 1 : 0);
            result = 31 * result + viewHeight;
            return result;
        }

        @Override
        public String toString() {
            return "ChangeEvent{" +
                "keyboardHeight=" + keyboardHeight +
                ", visible=" + visible +
                ", viewHeight=" + viewHeight +
                '}';
        }
    }
}


package commonlib.rxjava.keyboard;

import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;
import kr.ohlab.android.util.Assert;
import rx.Observable;
import rx.Subscriber;
import rx.android.MainThreadSubscription;
import timber.log.Timber;

public class TRSoftKeyboardVisibilityEventOnSubscribe
    implements Observable.OnSubscribe<TRSoftKeyboardVisibility.ChangeEvent> {
    private final View mTopView;
    private int mLastVisibleDecorViewHeight;
    private final Rect mWindowVisibleDisplayFrame = new Rect();

    public TRSoftKeyboardVisibilityEventOnSubscribe(View topView) {
        mTopView = topView;
    }

    private int computeWindowFrameHeight() {
        mTopView.getWindowVisibleDisplayFrame(mWindowVisibleDisplayFrame);
        return (mWindowVisibleDisplayFrame.bottom - mWindowVisibleDisplayFrame.top);
    }

    private TRSoftKeyboardVisibility.ChangeEvent checkKeyboardVisibility() {
        int windowFrameHeightNow = computeWindowFrameHeight();
        TRSoftKeyboardVisibility.ChangeEvent event = null;
        if (windowFrameHeightNow != mLastVisibleDecorViewHeight) {
            int mTopViewHeight = mTopView.getHeight();
            int heightDiff = mTopViewHeight - windowFrameHeightNow;
            Timber.e("XXX heightDiff=" + heightDiff);
            if (heightDiff > (mTopViewHeight / 4)) {
                event = TRSoftKeyboardVisibility.ChangeEvent.create(true, heightDiff, windowFrameHeightNow);
            } else {
                event = TRSoftKeyboardVisibility.ChangeEvent.create(false, 0, windowFrameHeightNow);
            }
            mLastVisibleDecorViewHeight = windowFrameHeightNow;
            return event;
        }

        return null;
    }

    public void call(final Subscriber<? super TRSoftKeyboardVisibility.ChangeEvent> subscriber) {
        Assert.checkUiThread();

        final ViewTreeObserver.OnGlobalLayoutListener listener =
            new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    TRSoftKeyboardVisibility.ChangeEvent event = checkKeyboardVisibility();
                    if( event == null)
                        return;
                    if (!subscriber.isUnsubscribed()) {
                        subscriber.onNext(event);
                    }
                }
            };

        mTopView.getViewTreeObserver().addOnGlobalLayoutListener(listener);

        subscriber.add(new MainThreadSubscription() {
            @Override
            protected void onUnsubscribe() {
                mTopView.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
            }
        });
    }
}
ohlab
fuente
0

Tuve un problema

Configuré windowDrawsSystemBarBackgrounds en 'verdadero' y mi aplicación debería aparecer debajo de la barra de estado.

Es mi tema de actividad.

<item name="android:windowTranslucentStatus" tools:targetApi="KITKAT">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>

y obtuve ayuda del blog de jianshu . Puedes leer código pero texto como yo. Añado algunos códigos más.

public final class ZeroInsetsFrameLayout extends FrameLayout {
    private int[] mInsets = new int[4];

    public ZeroInsetsFrameLayout(Context context) {
        super(context);
    }

    public ZeroInsetsFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ZeroInsetsFrameLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public final int[] getInsets() {
        return mInsets;
    }

    @Override
    public WindowInsets computeSystemWindowInsets(WindowInsets in, Rect outLocalInsets) {
        outLocalInsets.left = 0;
        outLocalInsets.top = 0;
        outLocalInsets.right = 0;

        return super.computeSystemWindowInsets(in, outLocalInsets);
    }

    @Override
    protected final boolean fitSystemWindows(@NonNull Rect insets) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            // Intentionally do not modify the bottom inset. For some reason,
            // if the bottom inset is modified, window resizing stops working.
            // TODO: Figure out why.

            mInsets[0] = insets.left;
            mInsets[1] = insets.top;
            mInsets[2] = insets.right;

            insets.left = 0;
            insets.top = 0;
            insets.right = 0;
        }

        return super.fitSystemWindows(insets);
    }
}

Este es mi diseño de fragmento.

<com.dhna.widget.ZeroInsetsFrameLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:background="@color/white">

    <!-- your xml code -->

</ZeroInsetsFrameLayout>

Quiero que te sea útil. ¡buena suerte!

Hogun
fuente
Es necesario ocultar y mostrar el teclado, y también se necesita tiempo para subir el diseño. Alguna solución ? Como administrar ?
Vanjara Sweta
0
  • Después de haber investigado en todos los foros. Estas formas no pueden ayudar a señalarlo. Suerte cuando intenté hacerlo de esta manera. Me ayuda a resolver el problema

XML

<RelativeLayout 
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:fitsSystemWindows="true">
       <!-- Your xml -->
    </RelativeLayout>

Actividad

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView("Your Activity");
   setAdjustScreen();

}

Func creado

protected void setAdjustScreen(){
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
        /*android:windowSoftInputMode="adjustPan|adjustResize"*/
}

Finalmente agregando algunas líneas a su mainifest

 <activity
     android:name="Your Activity"
     android:windowSoftInputMode="adjustPan|adjustResize"
     android:screenOrientation="portrait"></activity>
Trần Thanh Phong
fuente
0

Yo tuve el mismo problema. He resuelto usando coordinatorlayout

activity.main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    android:layout_height="match_parent" android:layout_width="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">


    <android.support.design.widget.AppBarLayout
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:layout_height="?attr/actionBarSize"
        android:layout_width="match_parent"
        app:popupTheme="@style/AppTheme.PopupOverlay"
        android:background="?attr/colorPrimary"
        android:id="@+id/toolbar"/>

</android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main2"/>

</android.support.design.widget.CoordinatorLayout>

content_main2.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">


    <android.support.v7.widget.RecyclerView
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:layout_marginTop="30dp"
        android:layout_marginBottom="30dp"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        android:id="@+id/post_msg_recyclerview">
    </android.support.v7.widget.RecyclerView>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="50dp"
        app:layout_constraintBottom_toBottomOf="parent"
        android:background="@color/colorPrimary"


        />

</android.support.constraint.ConstraintLayout>

MainActivity.java

ahora agregue esta línea linearLayoutManager.setStackFromEnd (true);

 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(linearLayoutManager);
        Adapter adapter1=new Adapter(arrayList);
        recyclerView.setAdapter(adapter1);
gaurav gupta
fuente
0
<androidx.constraintlayout.widget.ConstraintLayout
  android:fitsSystemWindows="true">

  <androidx.coordinatorlayout.widget.CoordinatorLayout>
    <com.google.android.material.appbar.AppBarLayout>

      <com.google.android.material.appbar.CollapsingToolbarLayout/>

    </com.google.android.material.appbar.AppBarLayout>

    <androidx.core.widget.NestedScrollView>
    <Editext/>
    <androidx.core.widget.NestedScrollView/>

  </androidx.coordinatorlayout.widget.CoordinatorLayout>

</androidx.constraintlayout.widget.ConstraintLayout>
shehan gamage
fuente
0

Agregue esto primero en su diseño raíz.

android:fitsSystemWindows="true"

Cuando utiliza este enfoque, se convierte en su responsabilidad asegurarse de que las partes críticas de la interfaz de usuario de su aplicación (por ejemplo, los controles integrados en una aplicación de Mapas) no terminen siendo cubiertas por las barras del sistema. Esto podría hacer que su aplicación sea inutilizable. En la mayoría de los casos, puede manejar esto agregando el atributo android: fitsSystemWindows a su archivo de diseño XML, establecido en verdadero. Esto ajusta el relleno del ViewGroup primario para dejar espacio para las ventanas del sistema. Esto es suficiente para la mayoría de las aplicaciones.

Sin embargo, en algunos casos, es posible que deba modificar el relleno predeterminado para obtener el diseño deseado para su aplicación. Para manipular directamente cómo se presenta su contenido en relación con las barras del sistema (que ocupan un espacio conocido como "insertos de contenido" de la ventana), anule fitSystemWindows (insertos Rect). La jerarquía de vistas llama al método fitSystemWindows () cuando las inserciones de contenido de una ventana han cambiado, para permitir que la ventana ajuste su contenido en consecuencia. Al anular este método, puede manejar las inserciones (y, por lo tanto, el diseño de su aplicación) como lo desee.

https://developer.android.com/training/system-ui/status#behind

Si quieres convertirte en un instalador de ventanas maestro, mira el video del desarrollador de Android. https://www.youtube.com/watch?v=_mGDMVRO3iE

Xiaoyuan hu
fuente
-1

La mejor práctica permite al usuario desplazarse por el contenido cuando se muestra el teclado. Entonces, para agregar esta funcionalidad, debe colocar su diseño raíz dentro ScrollViewy usarwindowSoftInputMode="adjustResize" método de actividad .

Pero si quieres usar esta funcionalidad con <item name="android:windowTranslucentStatus">true</item> marca en el contenido de Android 5 no será desplazable y se superpondrá con el teclado.

Para resolver este problema, verifique esta respuesta

Arrojar
fuente