windowSoftInputMode = "коригуватиРезмер" не працює з напівпрозорою дією / навігацією


129

У мене виникають проблеми з напівпрозорою панеллю дій / навібаром у новій Android KitKat (4.4) та windowSoftInputMode="adjustResize".

Зазвичай змінюючи InputMode на налаштуванняResize, додаток має змінювати розмір, коли відображається клавіатура ... але тут це не буде! Якщо я видалю рядки для прозорого ефекту, зміна розміру працює.

Тож якщо клавіатура видна, мій ListView знаходиться під нею, і я не можу отримати доступ до останніх кількох елементів. (Лише приховавши клавіатуру вручну)

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>

значення-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>

Хтось ідеї виправити це?


Відповіді:


184

Вам не вистачає такої властивості:

android:fitsSystemWindows="true"

в корені RelativeLayoutцього фрагмента макету .xml.

Оновлення:

Минулого року пройшла цікава розмова Кріса Бейн, яка дуже докладно пояснює, як це працює:

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


5
Я думаю, це щось із повноекранної політики
Felix.D,

1
Ти чоловік! Я ця проблема трапилася зі мною лише у версії Lollipop, і вона її виправляє.
Девід

6
@David Це ще не виправлено, все ще ламається на пристрої зефіру, якщо ви відкриєте діалогове вікно і спробуєте прокрутити, тоді програмна дошка заблокує прокрутку
Bytecode

5
Він працює, але конфліктує з моєю панеллю інструментів та налаштуванням панелі стану
Ninja

2
працює, але тоді рядок стану вже не просвічується. Я хочу, щоб макет охоплював весь екран.
хтафоя

34

Там у відповідній доповіді помилки тут . Я знайшов рішення, яке, за умови обмеженого тестування, здається, що робить трюк без жодних наслідків. Додайте власну реалізацію вашого кореня ViewGroup(я майже завжди використовую FrameLayout, тому це те, що я перевірив) за допомогою логіки нижче. Потім використовуйте цей власний макет замість вашого кореневого макета та переконайтеся, що ви встановили android:fitsSystemWindows="true". Потім ви можете просто зателефонувати в getInsets()будь-який час після макета (наприклад, додати OnPreDrawListener), щоб відрегулювати решту вашого макета, щоб врахувати системні вставки.

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

Оскільки fitSystemWindowзастарілий s застарілий, зверніться до відповіді нижче, щоб завершити вирішення.


1
Насправді SOFT_INPUT_ADJUST_PAN, здається, НЕ ігнорується відповідно до мого досвіду - він переміститься на весь екран вгору, включаючи системну панель та клавіатуру зсуву під зосередженим поданням.
sealskej

Дякуємо - ви праві щодо SOFT_INPUT_ADJUST_PAN. Я використав це у своєму фрагменті: getActivity (). GetWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Саймон

Це був єдиний спосіб, який я міг досягти, налаштувавшиResize на активність (необхідну для прокрутки подання за допомогою клавіатури), fitSystemWindows встановив як істинний, щоб прокрутка насправді траплялася на> = Lollipop і мала напівпрозорий статусBar. Дуже дякую.
Лукас

це власне рішення
martyglaubitz

Потрібен час, щоб показати та приховати клавіатуру, навіть потрібно просунути макет вгору. Будь-яке рішення?
Vanjara Sweta

28

Відповідь @kcoppock справді корисна, але fitSystemWindows застарілий на рівні 20 API

Отже, оскільки API 20 (KITKAT_WATCH) вам слід перекрити 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;
    }
}

У якому класі ми повинні це перекрити?
Ben-J

@ Ben-J у класі, який розширює оригінальний клас
Victor91

Я поняття не маю, чому ви встановлюєте елементи масиву mInsets, поки він не використовується, але він працює
Buckstabue

1
Замість перевірки вашої версії ви можете скористатисяViewCompat.setOnApplyWindowInsetsListener
репліку

Я не міг отримати цю роботу, але перевизначення dispatchApplyWindowInsetsзамість ( той же код) працював для мене
Петтер

11

Це працювало для мене, щоб мати напівпрозорий рядок стану та коригуватиРезмір у фрагменті:

  1. Зробіть власну відносну розкладку, як сказали @ Victor91 та @kcoppock.

  2. Використовуйте CustomRelativeLayout як батьківський макет для свого фрагмента.

  3. Оголосити тему за допомогою android: windowTranslucentStatus = true

  4. Активність контейнера повинна бути оголошена в Manifest з android: windowSoftInputMode = "коригуватиРезмер" та використовувати заявлену тему

  5. Будь ласка, використовуйте fitsSystemWindows для фрагмента кореневого макета!

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

Потім у 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
Це найкраща відповідь поки що, і я шукаю рішення вже деякий час. Це прекрасно працює, але вам потрібно додати кілька додаткових накладок на панель інструментів, без цього ваша панель інструментів буде перекриватися панеллю стану
Пауліна

А що з вікном «Транслюцентрація»? чи можете ви допомогти у цьому?
V-rund Puro-hit

10

Якщо ви хочете налаштувати вставки та орієнтуєтесь на рівень API> = 21, ви можете це зробити без створення спеціальної групи перегляду. Щойно встановивши, fitsSystemWindowsпрокладки будуть застосовані до перегляду контейнерів за замовчуванням, чого ви, можливо, не захочете.

Перевірки версій вбудовані в цей метод, і лише пристрої> = 21 виконають код всередині лямбда. Приклад Котліна:

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

Переконайтеся, що у вашому макеті все ще встановлено fitsSystemWindowsпрапор, інакше слухач віконних вкладок не буде викликаний.

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

Ці джерела корисні:

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


1
Це все ще залишається найкращим підходом, оскільки ви можете застосувати це ваш BaseFragment, разом з, view.fitsSystemWindows = trueі він просто працює без будь-яких змін у фактичних макетах XML або Переглядати підкласи.
Богдан Зурак

5

У мене була така ж проблема, у "Моїй активності" був ScrollView як кореневий вигляд, і при активованій напівпрозорій панелі стану він не змінював розміру правильно, коли клавіатура показала ... і, відповідно, екран не прокручував, ховаючи вхідні подання.

Рішення: перемістив усе (макет та логіку діяльності) всередині нового фрагмента. Потім змінив активність, щоб включити лише цей фрагмент. Зараз все працює як очікувалося!

Це макет діяльності:

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

Працює як принадність для мене
imike

2

На основі вирішення Джозефа Джонсона в Android Як налаштувати макет у повноекранному режимі, коли видно програмне меню

називають це onCreate()після того, як setContentView()у вашій діяльності.

AndroidBug5497Workaround.assistActivity(this);

літт, що відрізняється від оригінальної заміни return (r.bottom - r.top);на return r.bottom;вcomputeUsableHeight()

чомусь я повинен встановити fitsSystemWindowsатрибут своєї активності false.

цей спосіб мене врятував. це добре працює для мене. сподівання може вам допомогти.

клас реалізації:

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

}

2

Він не повинен працювати з напівпрозорою смугою стану; це налаштування примушує вікно в режим повноекранного режиму, який не працює з налаштуваннямResize.

Ви можете або скористатися функцією prilagodPan, або використовувати властивості fitsSystemWindows. Я б запропонував прочитати про цю функцію, проте вона має суттєві побічні ефекти:

https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec


0

AndroidBug5497Workaround.java подбайте про витік пам'яті. потрібно нижче коду

getViewTreeObserver().removeOnGlobalLayoutListener(listener);

Мій зразок, що використовує RxJava, який автоматично викликає deleteOnGlobalLayoutListener (), коли onPause () у життєвому циклі діяльності

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

У мене була така проблема.

Я встановив windowDrawsSystemBarBackgrounds на "true", і моя програма повинна відображатися в рядку стану.

Це моя тема діяльності.

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

і я отримав допомогу з блогу jianshu . ви можете читати код, але текст, як я. Додаю ще трохи коду.

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

Це мій фрагмент макет.

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

Я хочу, щоб це було вам корисно. Щасти!


Це потрібно час, щоб приховати і показати клавіатуру, а також потрібно час, щоб підштовхнути макет вгору. Будь-яке рішення? Як керувати?
Vanjara Sweta

0
  • Після того, як я дослідив на всіх форумах. шляхові способи не можуть не виділити. Пощастило, коли я спробував зробити це таким чином. Це допомагає мені вирішити проблему

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>

Діяльність

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

}

Створено Функ

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

Нарешті додайте кілька рядків до вашого майніфесту

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

0

У мене була така ж проблема. Я вирішив за допомогою координаторного розкладу

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

тепер додайте цей рядок linearLayoutManager.setStackFromEnd (вірно);

 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

Додайте це спочатку у свій корінний макет.

android:fitsSystemWindows="true"

Коли ви використовуєте цей підхід, ви несете відповідальність за те, щоб критичні частини інтерфейсу вашої програми (наприклад, вбудовані елементи керування в програмі Карти) не покривались системними панелями. Це може зробити ваш додаток непридатним. У більшості випадків ви можете впоратися з цим, додавши атрибут android: fitsSystemWindows до файлу макета XML, встановленого на true. Це налаштовує прокладку батьківського ViewGroup, щоб залишити місце для вікон системи. Цього достатньо для більшості застосувань.

Однак у деяких випадках вам може знадобитися змінити підкладку за замовчуванням, щоб отримати бажаний макет для вашої програми. Щоб безпосередньо маніпулювати тим, як ваш вміст розміщується відносно системних панелей (які займають простір, відомий як «вмістові вставки» вікна), замініть fitSystemWindows (Rect вставки). Метод fitSystemWindows () викликається ієрархією перегляду, коли вставки змісту для вікна змінилися, щоб вікно могло відповідно відрегулювати свій вміст. Перевіривши цей метод, ви можете обробляти вставки (а отже, і макет програми), як вам захочеться.

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

Якщо ви хочете стати головним монтажником вікон, перегляньте це відео від розробника Android. https://www.youtube.com/watch?v=_mGDMVRO3iE


-1

Найкраща практика дозволяє користувачеві прокручувати вміст, коли відображається клавіатура. Отже, щоб додати цю функціональність, вам потрібно ввести макет кореня всередину ScrollViewта використовувати windowSoftInputMode="adjustResize"метод діяльності.

Але якщо ви хочете використовувати цю функціональність з <item name="android:windowTranslucentStatus">true</item> прапором на Android 5, вміст не буде прокручуватися і перекриється клавіатурою.

Щоб вирішити це питання, перевірте цю відповідь

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.