windowSoftInputMode = "AdjustResize" non funziona con azione / barra di navigazione traslucida


129

Ho problemi con la actionbar / navbar traslucida nel nuovo Android KitKat (4.4) e windowSoftInputMode="adjustResize".

Cambiando normalmente InputMode in AdjustResize, l'app dovrebbe ridimensionarsi quando viene mostrata la tastiera ... ma qui non lo farà! Se elimino le righe per l'effetto trasparente, il ridimensionamento funziona.

Quindi, se la tastiera è visibile, il mio ListView è sotto di essa e non riesco ad accedere agli ultimi elementi. (Solo nascondendo la tastiera 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>

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

Qualcuno ha idee per risolvere questo?


Risposte:


184

Manca la seguente proprietà:

android:fitsSystemWindows="true"

nella radice RelativeLayoutdel frammento .xml layout.

Aggiornare:

L'anno scorso c'è stato un discorso interessante di Chris Bane che spiega in dettaglio come funziona:

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


5
Immagino sia qualcosa con la politica a schermo intero
Felix.D,

1
Tu sei l'uomo! Questo problema mi è successo solo nella versione Lollipop e lo ha risolto.
David,

6
@David Non è stato ancora risolto, si interrompe ancora nel dispositivo marshmallow, se si apre una finestra di dialogo e si tenta di scorrere, il softkey bloccherà lo scorrimento
Bytecode

5
Funziona, ma è in conflitto con la mia barra degli strumenti e la personalizzazione della barra di stato
Ninja

2
funziona ma la barra di stato non è più traslucida. Voglio che il layout copra l'intero schermo.
htafoya,

34

C'è una segnalazione di bug correlata qui . Ho trovato una soluzione alternativa che, da test limitati, sembra fare il trucco senza ripercussioni. Aggiungi un'implementazione personalizzata del tuo root ViewGroup(lo uso quasi sempre FrameLayout, quindi questo è ciò con cui ho provato) con la logica qui sotto. Quindi, utilizzare questo layout personalizzato al posto del layout di root e assicurarsi di impostare android:fitsSystemWindows="true". È quindi possibile chiamare in getInsets()qualsiasi momento dopo il layout (ad esempio aggiungere un OnPreDrawListener) per regolare il resto del layout in modo da tenere conto delle inserzioni del sistema, se lo si desidera.

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

Poiché fitSystemWindows è stato deprecato, fare riferimento alla risposta di seguito per completare la soluzione alternativa.


1
In realtà SOFT_INPUT_ADJUST_PAN sembra NON essere ignorato in base alla mia esperienza: si sposterà l'intero schermo verso l'alto, inclusa la barra di sistema e sposta la tastiera in vista focalizzata.
sealskej,

Grazie - hai ragione riguardo a SOFT_INPUT_ADJUST_PAN. L'ho usato nel mio frammento: getActivity (). GetWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Simon,

Questo è stato l'unico modo che ho potuto ottenere con un aggiustamento ridimensionato per l'attività (necessario per lo scorrimento della vista quando si mostra la tastiera), fitSystemWindows impostato su true in modo che lo scorrimento avvenga effettivamente su> = Lollipop e con statusBar traslucido. Molte grazie.
Lucas,

questa è la vera soluzione
martyglaubitz,

Ci vuole tempo per mostrare e nascondere la tastiera, anche se ci vuole tempo per spostare il layout verso l'alto. Qualche soluzione?
Vanjara Sweta,

28

La risposta di @kcoppock è davvero utile, ma fitSystemWindows è stato deprecato nel livello API 20

Quindi da API 20 (KITKAT_WATCH) dovresti sovrascrivere suApplyWindowInsets

@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;
    }
}

In quale classe dovremmo scavalcare questo?
Ben-J,

@ Ben-J in una classe che estende la classe originale
Victor91

Non ho idea del perché imposti gli elementi dell'array mInsets mentre non viene utilizzato, ma funziona
Buckstabue,

1
Invece del controllo della versione che puoi usareViewCompat.setOnApplyWindowInsetsListener
ripeti il

Non sono riuscito a farlo funzionare, ma l'override dispatchApplyWindowInsetsinvece (stesso codice) ha funzionato per me
petter

11

Questo ha funzionato per me avere una barra di stato traslucida e regolare Ridimensiona in frammento:

  1. Crea un RelativeLayout personalizzato come dicevano @ Victor91 e @kcoppock.

  2. Usa CustomRelativeLayout come layout principale per il tuo frammento.

  3. Dichiara tema con android: windowTranslucentStatus = true

  4. Il contenitore Activity deve essere dichiarato in Manifest con android: windowSoftInputMode = "AdjustResize" e usa il tema dichiarato

  5. Si prega di utilizzare fitsSystemWindows sul layout radice dei frammenti!

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

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

1
Questa è la risposta migliore finora e sto cercando una soluzione da qualche tempo. Funziona perfettamente, ma devi aggiungere un po 'di riempimento extra alla tua barra degli strumenti, senza di essa la barra degli strumenti si sovrapporrà alla barra di stato
Paulina,

Che dire di windowTranslucentNavigation? puoi aiutarci?
V-rund Puro ha colpito il

10

Se desideri personalizzare gli inserti e stai scegliendo come target il livello API> = 21, puoi farlo senza dover creare un gruppo di visualizzazioni personalizzato. Impostando semplicemente il fitsSystemWindowspadding verrà applicato alla vista del container per impostazione predefinita, cosa che potresti non desiderare.

I controlli di versione sono integrati in questo metodo e solo i dispositivi> = 21 eseguiranno il codice all'interno della lambda. Esempio di Kotlin:

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

Assicurati che il layout imposti ancora il fitsSystemWindowsflag, altrimenti non verrà chiamato l'ascoltatore di inserti di finestre.

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

Queste fonti sono utili:

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


1
Questo rimane ancora l'approccio migliore, poiché è possibile applicare questo è il tuo BaseFragment, insieme a view.fitsSystemWindows = truee funziona solo senza modifiche ai layout XML effettivi o alle sottoclassi Visualizza.
Bogdan Zurac,

5

Ho avuto lo stesso problema, La mia attività aveva un ScrollView come vista di root e con la barra di stato traslucida attivata non si ridimensionava correttamente quando la tastiera mostrava ... e di conseguenza lo schermo non scorreva nascondendo le viste di input.

Soluzione: spostato tutto (logica di layout e attività) all'interno di un nuovo frammento. Quindi ha modificato l'attività per includere solo questo frammento. Ora tutto funziona come previsto!

Questo è il layout dell'attività:

<?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" />

Funziona come un incantesimo per me
come il

2

Basato sulla soluzione alternativa di Joseph Johnson in Android Come regolare il layout in modalità schermo intero quando è visibile la tastiera virtuale

chiamalo onCreate()dopo setContentView()nella tua attività.

AndroidBug5497Workaround.assistActivity(this);

una litte diversa dall'originale sostituisce return (r.bottom - r.top);con return r.bottom;incomputeUsableHeight()

per qualche motivo, devo impostare il mio fitsSystemWindowsattributo di attività su false.

questa soluzione alternativa mi ha salvato. funziona bene per me. la speranza può aiutarti.

la classe di implementazione è:

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

}


0

AndroidBug5497Workaround.java fai attenzione alla perdita di memoria. è necessario sotto il codice

getViewTreeObserver().removeOnGlobalLayoutListener(listener);

Il mio esempio con RxJava che chiama automaticamente removeOnGlobalLayoutListener () quando onPause () nel ciclo di vita di 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);
            }
        });
    }
}

0

Ho avuto un problema.

Ho impostato windowDrawsSystemBarBackgrounds su "true" e la mia app dovrebbe essere visualizzata nella barra di stato.

È il mio tema di attività.

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

e ho ricevuto aiuto dal blog di jianshu . puoi leggere il codice ma testo come me. Aggiungo qualche altro codice.

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

Questo è il mio layout dei frammenti.

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

Voglio che ti sia utile. in bocca al lupo!


Ci vuole tempo per nascondere e mostrare la tastiera e ci vuole anche tempo per spostare il layout verso l'alto. Qualche soluzione? Come gestire?
Vanjara Sweta,

0
  • Dopo aver fatto ricerche su tutti i forum. questi modi non possono aiutare a scoprire. Fortunato quando ho provato a fare così. Mi aiuta a risolvere il 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>

Attività

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

}

Creato Func

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

Infine aggiungendo alcune righe al tuo mainifest

 <activity
     android:name="Your Activity"
     android:windowSoftInputMode="adjustPan|adjustResize"
     android:screenOrientation="portrait"></activity>

0

Ho avuto lo stesso problema. Ho risolto 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

ora aggiungi questa riga linearLayoutManager.setStackFromEnd (true);

 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(linearLayoutManager);
        Adapter adapter1=new Adapter(arrayList);
        recyclerView.setAdapter(adapter1);

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>

0

Aggiungi prima questo nel tuo layout di root.

android:fitsSystemWindows="true"

Quando usi questo approccio, diventa tua responsabilità assicurarti che le parti critiche dell'interfaccia utente della tua app (ad esempio i controlli integrati in un'applicazione Maps) non finiscano per essere coperte dalle barre di sistema. Ciò potrebbe rendere la tua app inutilizzabile. Nella maggior parte dei casi puoi gestirlo aggiungendo l'attributo android: fitsSystemWindows al tuo file di layout XML, impostato su true. Ciò regola il riempimento del ViewGroup principale per lasciare spazio alle finestre di sistema. Questo è sufficiente per la maggior parte delle applicazioni.

In alcuni casi, tuttavia, potrebbe essere necessario modificare il riempimento predefinito per ottenere il layout desiderato per l'app. Per manipolare direttamente il modo in cui il contenuto viene distribuito rispetto alle barre di sistema (che occupano uno spazio noto come "insiemi di contenuti" della finestra), sovrascrivi fitSystemWindows (insiemi Rect). Il metodo fitSystemWindows () viene chiamato dalla gerarchia della vista quando gli inserimenti del contenuto di una finestra sono cambiati, per consentire alla finestra di adeguare il contenuto di conseguenza. Sovrascrivendo questo metodo puoi gestire gli inserti (e quindi il layout della tua app) come desideri.

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

Se vuoi diventare un installatore di finestre master, ti preghiamo di guardare il video dallo sviluppatore Android. https://www.youtube.com/watch?v=_mGDMVRO3iE


-1

La migliore pratica consente all'utente di scorrere il contenuto quando viene visualizzata la tastiera. Quindi per aggiungere questa funzionalità è necessario inserire il layout di root all'interno ScrollViewe utilizzare il windowSoftInputMode="adjustResize"metodo di attività.

Ma se vuoi usare questa funzionalità con <item name="android:windowTranslucentStatus">true</item> flag su contenuti Android 5 non sarà scorrevole e si sovrapporrà con la tastiera.

Per risolvere questo problema, controlla questa risposta

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.