windowSoftInputMode =“adjustResize”가 반투명 액션 / 탐색기와 작동하지 않습니다


129

새로운 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>

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>

이 문제를 해결하기위한 아이디어가 있습니까?


답변:


184

다음과 같은 속성이 없습니다.

android:fitsSystemWindows="true"

조각 .xml 레이아웃 의 루트 RelativeLayout에 있습니다.

최신 정보:

작년에 Chris Bane의 흥미로운 대화가 있는데 이것이 어떻게 작동하는지 자세히 설명합니다.

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


5
나는 전체 화면으로 정책`의 뭔가 생각
Felix.D

1
당신은 남자입니다! 이 문제는 Lollipop 버전에서만 발생했으며 문제가 해결되었습니다.
David

6
@David 아직 고정되어 있지 않습니다. 여전히 마시맬로 장치가 깨집니다. 대화 상자를 열고 스크롤하면 softkeboard가 스크롤을 차단합니다
Bytecode

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

이후 fitSystemWindow의이 사용되지 않습니다 해결 방법을 완료하기 위해 아래에 대답을 참조하십시오.


1
실제로 SOFT_INPUT_ADJUST_PAN은 내 경험에 따라 무시되지 않는 것 같습니다. 초점을 맞춘보기에서 시스템 표시 줄 및 Shift 키보드를 포함하여 전체 화면을 위로 이동합니다.
sealskej

감사합니다. SOFT_INPUT_ADJUST_PAN에 대해 정확합니다. 내 조각에서 이것을 사용했습니다 : getActivity (). getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Simon

이것이 활동에 대한 adjustResize (키보드 표시시보기의 스크롤이 필요함)를 달성 할 수있는 유일한 방법이었습니다. fitSystemWindows는 true로 설정되어 스크롤이 실제로 == Lollipop에서 발생하고 반투명 statusBar를 갖습니다. 고마워
Lucas

이것은 실제 솔루션입니다
martyglaubitz

레이아웃을 위로 올리는 데 시간이 걸리더라도 키보드를 표시하고 숨기는 데 시간이 걸립니다. 어떤 솔루션?
Vanjara Sweta

28

@kcoppock 답변은 정말 유용하지만 API 수준 20에서는 fitSystemWindows가 더 이상 사용되지 않습니다.

따라서 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
repitch

나는 이것을 작동시킬 수 없었지만 dispatchApplyWindowInsets대신 (같은 코드)를 재정의 했습니다.
petter

11

이것은 반투명 상태 표시 줄을 가지고 조각에서 adjustResize를 만들었습니다.

  1. @ Victor91과 @kcoppock이 말한 것처럼 사용자 정의 RelativeLayout을 만듭니다.

  2. 조각의 부모 레이아웃으로 CustomRelativeLayout을 사용하십시오.

  3. android : windowTranslucentStatus = true로 테마 선언

  4. 컨테이너 활동은 android : windowSoftInputMode = "adjustResize"를 사용하여 Manifest에서 선언되고 선언 된 테마를 사용해야합니다.

  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
이것은 지금까지 가장 좋은 대답이며, 지금은 해결책을 찾고 있습니다. 완벽하게 작동하지만 툴바에 추가 패딩을 추가해야합니다. 툴바가 없으면 상태 바가 겹치게됩니다.
Paulina

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

같은 문제가 있었는데 내 활동에는 루트보기로 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 에서 Joseph Johnson의 해결 방법 기반 소프트 키보드가 표시 될 때 전체 화면 모드에서 레이아웃을 조정하는 방법

당신의 활동 onCreate()후에 이것을 호출 setContentView()하십시오.

AndroidBug5497Workaround.assistActivity(this);

원본에서 litte의 다른 교체 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;
}

}


0

AndroidBug5497Workaround.java는 메모리 누수를 처리합니다. 아래 코드 필요

getViewTreeObserver().removeOnGlobalLayoutListener(listener);

Activity의 라이프 사이클에서 onPause () 일 때 자동으로 removeOnGlobalLayoutListener ()를 호출하는 RxJava를 사용하는 샘플

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
  • 모든 포럼에서 조사한 후 thoese 방법은 지적을 찾을 수 없습니다. 내가 이런 식으로 시도했을 때 운이 좋다. 문제 해결에 도움이됩니다.

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>

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>

0

루트 레이아웃에서 먼저 추가하십시오.

android:fitsSystemWindows="true"

이 접근 방식을 사용하면 앱 UI의 중요한 부분 (예 :지도 애플리케이션의 내장 컨트롤)이 시스템 표시 줄에 얽 히지 않도록해야합니다. 앱을 사용할 수 없게 될 수 있습니다. 대부분의 경우 android : fitsSystemWindows 속성을 XML 레이아웃 파일에 추가하여 true로 설정하여이를 처리 할 수 ​​있습니다. 이것은 시스템 창을위한 공간을 남기기 위해 부모 ViewGroup의 패딩을 조정합니다. 대부분의 응용 프로그램에 충분합니다.

그러나 경우에 따라 앱의 원하는 레이아웃을 얻기 위해 기본 패딩을 수정해야 할 수도 있습니다. 윈도우의 "컨텐츠 삽입"으로 알려진 공간을 차지하는 시스템 막대를 기준으로 컨텐트가 배치되는 방식을 직접 조작하려면 fitSystemWindows (Rect insets)를 재정의하십시오. fitSystemWindows () 메소드는 창의 컨텐츠 삽입이 변경 될 때 뷰 계층 구조에 의해 호출되어 창의 컨텐츠를 적절하게 조정할 수 있습니다. 이 방법을 재정의하면 원하는대로 삽입물 (및 따라서 앱의 레이아웃)을 처리 할 수 ​​있습니다.

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

당신이 마스터 창 피팅이되고 싶다면, 안드로이드 개발자의 비디오를 참조하십시오. https://www.youtube.com/watch?v=_mGDMVRO3iE


-1

모범 사례는 키보드가 표시 될 때 사용자가 컨텐츠를 스크롤 할 수 있도록합니다. 따라서이 기능을 추가하려면 루트 레이아웃 ScrollView을 사용하고 windowSoftInputMode="adjustResize"활동 방법을 사용해야 합니다.

그러나 <item name="android:windowTranslucentStatus">true</item> Android 5 콘텐츠에서 플래그 와 함께이 기능을 사용하려면 스크롤 할 수 없으며 키보드와 겹칩니다.

이 문제를 해결하려면이 답변을 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.