windowSoftInputMode = Điều chỉnhResize 'Không hoạt động với hành động mờ / thanh điều hướng


129

Tôi gặp vấn đề với thanh hành động / thanh điều hướng mờ trong Android KitKat mới (4.4) và windowSoftInputMode="adjustResize".

Normaly thay đổi InputMode thành điều chỉnhResize, ứng dụng sẽ tự thay đổi kích thước khi bàn phím được hiển thị ... nhưng ở đây sẽ không! Nếu tôi xóa các dòng cho hiệu ứng trong suốt, thay đổi kích thước đang hoạt động.

Vì vậy, nếu bàn phím hiển thị, ListView của tôi nằm dưới bàn phím và tôi không thể truy cập vào một vài mục cuối cùng. (Chỉ bằng cách ẩn bàn phím bằng tay)

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>

giá trị-v19 / style.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>

mảnh vỡ

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

Bất cứ ai có ý tưởng để sửa lỗi này?


Câu trả lời:


184

Bạn đang thiếu tài sản sau:

android:fitsSystemWindows="true"

trong thư mục gốc RelativeLayoutcủa đoạn bố trí .xml.

Cập nhật:

Năm ngoái đã có một cuộc nói chuyện thú vị của Chris Bane giải thích chi tiết về cách thức hoạt động của nó:

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


5
Tôi đoán đó là một cái gì đó với chính sách toàn màn hình
Felix.D

1
Bạn là người đàn ông! Tôi vấn đề này chỉ xảy ra với tôi trên phiên bản Lollipop và nó đã khắc phục nó.
David

6
@David Nó chưa được sửa, vẫn bị hỏng trong thiết bị marshmallow, nếu bạn mở hộp thoại và thử cuộn thì softkeboard sẽ chặn cuộn
Bytecode

5
Nó hoạt động, nhưng xung đột với thanh công cụ và tùy chỉnh thanh trạng thái của tôi
Ninja

2
hoạt động nhưng sau đó thanh trạng thái không còn mờ nữa. Tôi muốn bố trí để bao phủ toàn bộ màn hình.
htafoya

34

Có một báo cáo lỗi liên quan ở đây . Tôi đã tìm thấy một cách giải quyết rằng, từ thử nghiệm hạn chế, dường như thực hiện mánh khóe không có hậu quả. Thêm một triển khai tùy chỉnh gốc của bạn ViewGroup(tôi hầu như luôn luôn sử dụng FrameLayout, vì vậy đây là những gì tôi đã thử nghiệm) với logic bên dưới. Sau đó, sử dụng bố cục tùy chỉnh này thay cho bố cục gốc của bạn và đảm bảo bạn đặt android:fitsSystemWindows="true". Sau đó, bạn có thể gọi getInsets()bất cứ lúc nào sau khi bố trí (ví dụ: thêm một OnPreDrawListener) để điều chỉnh phần còn lại của bố cục của bạn để giải thích cho các phần tử hệ thống, nếu muốn.

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 không được dùng nữa, vui lòng tham khảo câu trả lời bên dưới để hoàn thành cách giải quyết.


1
Trên thực tế SOFT_INPUT_ADJUST_PAN dường như KHÔNG bị bỏ qua theo kinh nghiệm của tôi - nó sẽ di chuyển toàn bộ màn hình lên, bao gồm thanh hệ thống và bàn phím thay đổi trong chế độ xem tập trung.
sealskej

Cảm ơn - bạn đã đúng về SOFT_INPUT_ADJUST_PAN. Tôi đã sử dụng điều này trong đoạn của mình: getActivity (). GetWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Simon

Đó là cách duy nhất tôi có thể đạt được khi điều chỉnhResize cho hoạt động (cần thiết để cuộn chế độ xem khi hiển thị bàn phím), fitSystemWindows đặt thành đúng để cuộn thực sự xảy ra trên> = Lollipop và có trạng thái mờBar. Cảm ơn rất nhiều.
Lucas

đây là giải pháp thực tế
martyglaubitz

Sẽ mất thời gian để hiển thị và ẩn bàn phím, thậm chí phải mất thời gian để đẩy bố cục lên. Bất kì giải pháp nào ?
Vanjara Sweta

28

Câu trả lời @kcoppock thực sự hữu ích, nhưng fitSystemWindows không được dùng ở cấp độ API 20

Vì vậy, vì API 20 (KITKAT_WATCH), bạn nên ghi đè lênApplyWindowInsets

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

Trong lớp nào chúng ta nên ghi đè này?
Ben-J

@ Ben-J trong một lớp học mở rộng lớp gốc
Victor91

Tôi không biết tại sao bạn lại đặt các phần tử mảng trong khi nó không được sử dụng, nhưng nó hoạt động
Buckstabue

1
Thay vì kiểm tra phiên bản của bạn, bạn có thể sử dụngViewCompat.setOnApplyWindowInsetsListener
repitch

Tôi không thể làm việc này, nhưng dispatchApplyWindowInsetsthay vào đó , ghi đè (cùng mã) đã làm việc cho tôi
petter

11

Điều này làm việc cho tôi để có thanh trạng thái mờ và điều chỉnhResize trong đoạn:

  1. Tạo một RelativeLayout tùy chỉnh như @ Victor91 và @kcoppock nói.

  2. Sử dụng CustomRelativeLayout làm bố cục cha mẹ cho đoạn của bạn.

  3. Khai báo chủ đề với android: windowTranslucentStatus = true

  4. Hoạt động của thùng chứa phải được khai báo trong Manifest với android: windowSoftInputMode = "điều chỉnh kích thước" và sử dụng chủ đề đã khai báo

  5. Vui lòng sử dụng fitSystemWindows trên bố cục gốc mảnh!

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

Sau đó, trong 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
Đây là câu trả lời tốt nhất cho đến nay và bây giờ tôi đang tìm giải pháp. Nó hoạt động hoàn hảo, nhưng bạn phải thêm một số phần đệm thêm vào thanh công cụ của mình, nếu không có nó, thanh công cụ của bạn sẽ bị chồng chéo lên thanh trạng thái
Paulina

Điều gì về windowTranslucentNavulation? Bạn có thể giúp với điều đó?
V-rund Puro-hit

10

Nếu bạn muốn tùy chỉnh các phần tử và bạn đang nhắm mục tiêu cấp API> = 21, bạn có thể thực hiện việc này mà không phải tạo nhóm xem tùy chỉnh. Bởi chỉ cần thiết lập phần fitsSystemWindowsđệm sẽ được áp dụng cho chế độ xem container của bạn theo mặc định mà bạn có thể không muốn.

Kiểm tra phiên bản được tích hợp vào phương thức này và chỉ các thiết bị> = 21 sẽ thực thi mã bên trong lambda. Ví dụ về Kotlin:

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

Hãy chắc chắn rằng bố cục của bạn vẫn đặt fitsSystemWindowscờ nếu không cửa sổ sẽ lắng nghe người nghe.

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

Những nguồn này rất hữu ích:

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


1
Đây vẫn là phương pháp tốt nhất, vì bạn có thể áp dụng điều này là của bạn BaseFragment, cùng với view.fitsSystemWindows = truevà nó chỉ hoạt động mà không cần bất kỳ thay đổi bố trí XML thực tế hoặc Xem lớp con.
Bogdan Zurac

5

Tôi cũng gặp vấn đề tương tự, Hoạt động của tôi có ScrollView ở chế độ xem gốc và với thanh trạng thái mờ được kích hoạt, nó không thay đổi kích thước chính xác khi bàn phím hiển thị ... và theo đó, màn hình không cuộn ẩn các chế độ xem đầu vào.

Giải pháp: Đã di chuyển mọi thứ (bố cục và logic hoạt động) bên trong một Đoạn mới. Sau đó thay đổi Hoạt động để chỉ bao gồm Đoạn này. Bây giờ mọi thứ hoạt động như mong đợi!

Đây là cách bố trí của hoạt động:

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

Hoạt động như một cơ duyên đối với tôi
imike

2

Dựa trên cách giải quyết của Joseph Johnson trong Android Cách điều chỉnh bố cục ở Chế độ toàn màn hình khi hiển thị bảng phím mềm

gọi này onCreate()sau khi setContentView()trong hoạt động của bạn.

AndroidBug5497Workaround.assistActivity(this);

một litte khác với thay thế ban đầu return (r.bottom - r.top);với return r.bottom;trongcomputeUsableHeight()

vì một số lý do, tôi phải đặt fitsSystemWindowsthuộc tính hoạt động của mình thành false.

cách giải quyết này đã cứu tôi. nó hoạt động tốt với tôi hy vọng có thể giúp bạn

lớp thực hiện là:

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

Nó không hoạt động với thanh trạng thái mờ; cài đặt đó buộc cửa sổ ở chế độ toàn màn hình không hoạt động với điều chỉnhResize.

Bạn có thể sử dụng điều chỉnh hoặc sử dụng các thuộc tính phù hợp với hệ thống. Tôi sẽ đề nghị đọc về tính năng mặc dù, nó có tác dụng phụ đáng kể:

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


0

AndroidBug5497Workaround.java xử lý rò rỉ bộ nhớ. cần mã dưới đây

getViewTreeObserver().removeOnGlobalLayoutListener(listener);

Mẫu của tôi sử dụng RxJava tự động gọi removeOnGlobalLayoutListener () khi onPause () trong vòng đời của 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

Tôi đã có một vấn đề.

Tôi đặt windowDrawsSystemBarBackgrounds thành 'true' và ứng dụng của tôi sẽ hiển thị dưới thanh trạng thái.

Đó là chủ đề hoạt động của tôi.

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

và tôi đã nhận được sự giúp đỡ từ blog của jianshu . bạn có thể đọc mã nhưng văn bản như tôi. Tôi thêm vài mã nữa.

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

Đây là bố cục mảnh của tôi.

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

Tôi muốn nó hữu ích cho bạn. chúc may mắn!


Sẽ mất thời gian để ẩn và hiển thị bàn phím và cũng cần có thời gian để đẩy bố cục lên. Bất kì giải pháp nào ? Làm thế nào để quản lý ?
Vanjara Sweta

0
  • Sau khi tôi đã nghiên cứu trên tất cả các diễn đàn. cách thoese không thể giúp tìm ra điểm. May mắn khi tôi đã thử làm theo cách này. Nó giúp tôi giải quyết vấn đề

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>

Hoạt động

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

}

Tạo Func

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

Cuối cùng thêm một số dòng vào mainifest của bạn

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

0

Tôi đã từng gặp vấn đề tương tự. Tôi đã giải quyết bằng cách sử dụng phối hợp

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

bây giờ thêm dòng này 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

Thêm cái này đầu tiên tại bố trí gốc của bạn.

android:fitsSystemWindows="true"

Khi bạn sử dụng phương pháp này, bạn có trách nhiệm đảm bảo rằng các phần quan trọng trong giao diện người dùng của ứng dụng của bạn (ví dụ: các điều khiển tích hợp trong ứng dụng Bản đồ) sẽ không bị che bởi các thanh hệ thống. Điều này có thể làm cho ứng dụng của bạn không thể sử dụng được. Trong hầu hết các trường hợp, bạn có thể xử lý việc này bằng cách thêm thuộc tính android: fitSystemWindows vào tệp bố cục XML của bạn, được đặt thành đúng. Điều này điều chỉnh phần đệm của Viewgroup cha để chừa không gian cho các cửa sổ hệ thống. Điều này là đủ cho hầu hết các ứng dụng.

Tuy nhiên, trong một số trường hợp, bạn có thể cần sửa đổi phần đệm mặc định để có bố cục mong muốn cho ứng dụng của mình. Để trực tiếp thao tác làm thế nào nội dung của bạn có liên quan đến các thanh hệ thống (chiếm một khoảng trống được gọi là "nội dung" của cửa sổ), hãy ghi đè fitSystemWindows (Rect insets). Phương thức fitSystemWindows () được gọi bởi hệ thống phân cấp khung nhìn khi nội dung chèn cho một cửa sổ đã thay đổi, để cho phép cửa sổ điều chỉnh nội dung của nó cho phù hợp. Bằng cách ghi đè phương thức này, bạn có thể xử lý các phần tử (và do đó bố cục của ứng dụng) theo cách bạn muốn.

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

Nếu bạn muốn trở thành người chỉnh sửa cửa sổ chính, vui lòng xem video từ nhà phát triển Android. https://www.youtube.com/watch?v=_mGDMVRO3iE


-1

Thực tiễn tốt nhất cho phép người dùng cuộn nội dung khi bàn phím được hiển thị. Vì vậy, để thêm chức năng này, bạn cần đặt bố cục gốc của mình bên trong ScrollViewvà sử dụngwindowSoftInputMode="adjustResize" phương thức hoạt động.

Nhưng nếu bạn muốn sử dụng chức năng này với <item name="android:windowTranslucentStatus">true</item> cờ trên nội dung Android 5 sẽ không thể cuộn được và sẽ chồng lấp với bàn phím.

Để giải quyết vấn đề này, hãy kiểm tra câu trả lời này

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.