windowSoftInputMode = «adjustResize» не работает с полупрозрачным действием / навигационной панелью

130

У меня проблемы с полупрозрачной панелью действий / навигационной панелью в новом Android KitKat (4.4) и windowSoftInputMode="adjustResize".

Обычно меняя InputMode на AdjustResize, приложение должно изменять размер, когда отображается клавиатура ... но здесь этого не будет! Если я удалю линии для эффекта прозрачности, изменение размера работает.

Итак, если клавиатура видна, мой 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>

Есть идеи для исправления этого?

fabianbru
источник

Ответы:

185

Вам не хватает следующего свойства:

android:fitsSystemWindows="true"

в корне RelativeLayoutэтого фрагмента макета .xml.

Обновить:

В прошлом году был интересный доклад Криса Бейна, в котором подробно объясняется, как это работает:

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

pablisco
источник
5
Я предполагаю, что это что-то с политикой полноэкранного
режима
1
Ты человек! У меня эта проблема возникла только в версии Lollipop, и она исправлена.
Дэвид
6
@David Это еще не исправлено, все еще ломается в устройстве с зефиром, если вы откроете диалоговое окно и попытаетесь прокрутить, тогда softkeboard заблокирует прокрутку
байт-код
5
Это работает, но конфликтует с моей настройкой панели инструментов и строки состояния
Ninja
2
работает, но тогда строка состояния перестает быть полупрозрачной. Я хочу, чтобы макет занимал весь экран.
htafoya
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);
    }
}

Поскольку fitSystemWindows не рекомендуется, обратитесь к ответу ниже, чтобы решить проблему.

Кевин Коппок
источник
1
На самом деле SOFT_INPUT_ADJUST_PAN, похоже, НЕ игнорируется, согласно моему опыту - он будет перемещать весь экран вверх, включая системную панель и сдвигать клавиатуру в сфокусированном виде.
sealskej
Спасибо - вы правы относительно SOFT_INPUT_ADJUST_PAN. Я использовал это в своем фрагменте: getActivity (). GetWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Саймон
Это был единственный способ, которым я мог добиться, чтобы AdjustResize для активности (необходим для прокрутки представления при отображении клавиатуры), fitSystemWindows установлен как true, чтобы прокрутка действительно происходила на> = Lollipop и имела полупрозрачный statusBar. Большое спасибо.
Лукас
это реальное решение
Мартиглаубиц
Требуется время, чтобы показать и скрыть клавиатуру, даже если требуется время, чтобы сдвинуть макет вверх. Любое решение?
Vanjara Sweta
28

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

Итак, начиная с 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;
    }
}
Victor91
источник
В каком классе мы должны это переопределить?
Ben-J
@ Ben-J в классе, который расширяет исходный класс
Victor91
Понятия не имею, почему вы устанавливаете элементы массива mInsets, пока он не используется, но он работает
Бакстабуэ,
1
Вместо проверки версии вы можете использоватьViewCompat.setOnApplyWindowInsetsListener
переписать
Я не мог заставить это работать, но dispatchApplyWindowInsetsвместо этого переопределение (тот же код) сработало для меня
петтер
11

Это помогло мне иметь полупрозрачную строку состояния и AdjustResize во фрагменте:

  1. Сделайте собственный RelativeLayout, как сказали @ Victor91 и @kcoppock.

  2. Используйте CustomRelativeLayout в качестве родительского макета для вашего фрагмента.

  3. Объявить тему с помощью android: windowTranslucentStatus = true

  4. Контейнер Activity должен быть объявлен в манифесте с помощью android: windowSoftInputMode = "adjustResize" и использовать объявленную тему.

  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
На данный момент это лучший ответ, и я сейчас ищу решение. Он работает отлично, но вам нужно добавить дополнительные отступы на свою панель инструментов, без этого ваша панель инструментов будет перекрывать строку состояния
Паулина
А как насчет windowTranslucentNavigation? вы можете помочь с этим?
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 или подклассах View.
Bogdan Zurac
5

У меня была та же проблема, у My Activity был 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;
}

}
Loyea
источник
2

Не должно работать с полупрозрачной строкой состояния; этот параметр переводит окно в полноэкранный режим, который не работает с AdjustResize.

Вы можете использовать AdjustPan или свойства fitsSystemWindows. Я бы посоветовал прочитать об этой функции, хотя у нее есть серьезные побочные эффекты:

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

RESTfulGeoffrey
источник
0

AndroidBug5497Workaround.java позаботьтесь об утечке памяти. нужно под кодом

getViewTreeObserver().removeOnGlobalLayoutListener(listener);

Мой образец с использованием RxJava, который автоматически вызывает removeOnGlobalLayoutListener (), когда onPause () в жизненном цикле 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
источник
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>

и мне помогли блог Цзяньшу . вы можете читать код, но текст, как я. Я добавляю еще немного кода.

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>

Я хочу, чтобы он был вам полезен. удачи!

Hogun
источник
Требуется время, чтобы скрыть и показать клавиатуру, а также нужно время, чтобы развернуть макет вверх. Любое решение? Как управлять?
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();

}

Создан Func

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

Наконец, добавляем несколько строк в ваш mainifest

 <activity
     android:name="Your Activity"
     android:windowSoftInputMode="adjustPan|adjustResize"
     android:screenOrientation="portrait"></activity>
Trần Thanh Phong
источник
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 (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>
Shehan Gamage
источник
0

Сначала добавьте это в корневой макет.

android:fitsSystemWindows="true"

Когда вы используете этот подход, вы несете ответственность за то, чтобы важные части пользовательского интерфейса вашего приложения (например, встроенные элементы управления в приложении Maps) не были закрыты системными панелями. Это может сделать ваше приложение непригодным для использования. В большинстве случаев вы можете справиться с этим, добавив атрибут android: fitsSystemWindows в ваш XML-файл макета со значением true. Это регулирует отступ родительской ViewGroup, чтобы оставить место для системных окон. Этого достаточно для большинства приложений.

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

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

Если вы хотите стать мастером по установке окон, посмотрите видео от разработчика Android. https://www.youtube.com/watch?v=_mGDMVRO3iE

сяоюань ху
источник
-1

Лучшая практика позволяет пользователю прокручивать содержимое при отображении клавиатуры. Итак, чтобы добавить эту функциональность, вам нужно поместить корневой макет в метод Activity ScrollViewи использовать его windowSoftInputMode="adjustResize".

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

Чтобы решить эту проблему, проверьте этот ответ

цыпленок
источник