windowSoftInputMode = "एडजस्टाइज" पारभासी कार्रवाई / नावबार के साथ काम नहीं कर रहा है


129

मुझे नए एंड्रॉइड किटकैट (4.4) और में पारभासी एक्शनबार / नावबार के साथ समस्या है windowSoftInputMode="adjustResize"

सामान्य रूप से InputResode को 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>

इसे ठीक करने के लिए कोई विचार?


जवाबों:


184

आपको निम्न गुण याद आ रहे हैं:

android:fitsSystemWindows="true"

टुकड़े की जड़ RelativeLayoutमें .xml लेआउट।

अपडेट करें:

पिछले साल क्रिस बैन द्वारा एक दिलचस्प बात की गई थी जिसमें बताया गया था कि यह कैसे काम करता है:

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


5
मुझे लगता है कि यह फुल स्क्रीन पॉलिसी के साथ कुछ है
फेलिक्स

1
आप आदमी हो! मैं यह मुद्दा केवल लॉलीपॉप संस्करण पर मेरे साथ हुआ, और इसे ठीक कर दिया।
डेविड

6
@ डेविड यह अभी तक नियत नहीं है, फिर भी मार्शमैलो डिवाइस में ब्रेकिंग है, यदि आप एक डायलॉग खोलते हैं और स्क्रॉल करने की कोशिश करते हैं तो सॉफ्टबोर्ड स्क्रॉलिंग को ब्लॉक कर देगा
बाइटकोड

5
यह काम करता है, लेकिन मेरे टूलबार और स्टेटस अनुकूलन के साथ संघर्ष
निंजा

2
काम करता है, लेकिन तब स्थिति पट्टी पारभासी नहीं है। मैं चाहता हूं कि लेआउट पूरी स्क्रीन को कवर करे।
htafoya

34

यहाँ एक संबंधित बग रिपोर्ट है । मैंने एक वर्कअराउंड पाया है, जो कि सीमित परीक्षण से, बिना किसी नतीजे के चाल के साथ लगता है। अपनी जड़ का एक कस्टम कार्यान्वयन जोड़ें ViewGroup(मैं लगभग हमेशा उपयोग कर रहा हूं FrameLayout, इसलिए यही मैंने नीचे परीक्षण किया है) नीचे दिए गए तर्क के साथ। फिर, अपने रूट लेआउट के स्थान पर इस कस्टम लेआउट का उपयोग करें और सुनिश्चित करें कि आपने सेट किया है android:fitsSystemWindows="true"। आप तब चाहें तो getInsets()लेआउट के बाद किसी भी समय कॉल कर सकते हैं (उदाहरण के लिए a 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);
    }
}

चूंकि fitSystemWindowsrecated था, कृपया वर्कअराउंड पूरा करने के लिए नीचे दिए गए उत्तर को देखें।


1
वास्तव में SOFT_INPUT_ADJUST_PAN को मेरे अनुभव के अनुसार नजरअंदाज नहीं किया जाता है - यह पूरे स्क्रीन को ऊपर ले जाएगा, जिसमें सिस्टम बार और फ़ोकस व्यू के तहत कीबोर्ड शामिल होगा।
सीलकेज

धन्यवाद - आप SOFT_INPUT_ADJUST_PAN के बारे में सही हैं। मैंने इसे अपने टुकड़े में इस्तेमाल किया: getActivity ()। GetWindow ()। SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
शमौन

यह एकमात्र तरीका था जिसे मैं गतिविधि के लिए समायोजित कर सकता था। (कीबोर्ड दिखाने पर स्क्रॉल की आवश्यकता के लिए), fitSystemWindows सच के रूप में सेट किया गया है ताकि स्क्रॉल वास्तव में> = लॉलीपॉप और पारभासी स्थिति में हो। बहुत बहुत धन्यवाद।
लुकास

यह वास्तविक समाधान है
martyglaubitz

कीबोर्ड को दिखाने और छिपाने में समय लगता है यहां तक ​​कि लेआउट को ऊपर उठाने में भी समय लगता है। कोई भी समाधान ?
वंजारा स्वेता

28

@kcoppock उत्तर वास्तव में सहायक है, लेकिन fitSystemWindows एपीआई स्तर 20 में पदावनत किया गया था

इसलिए एपीआई 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;
    }
}

हमें किस वर्ग में इसे ओवरराइड करना चाहिए?
बेन-जे

@ बेन-जे एक वर्ग में जो मूल वर्ग का विस्तार करता है
विक्टर91

मुझे नहीं पता कि आपने mInsets सरणी तत्व क्यों सेट किए हैं, जबकि इसका उपयोग नहीं किया गया है, लेकिन यह काम करता है
बकस्टैब्यू

1
अपने संस्करण के बजाय जाँच आप उपयोग कर सकते हैंViewCompat.setOnApplyWindowInsetsListener
repitch

मैं यह काम नहीं कर सका, लेकिन dispatchApplyWindowInsetsइसके बजाय (एक ही कोड) ओवरराइडिंग ने मेरे लिए काम किया
पेटर

11

इसने मेरे लिए पारभासी स्थिति बार और खंड में समायोजित करने के लिए काम किया:

  1. एक कस्टम RelativeLayout @ Victor91 और @kcoppock ने कहा।

  2. अपने टुकड़े के लिए मूल लेआउट के रूप में CustomRelativeLayout का उपयोग करें।

  3. Android के साथ थीम घोषित करें: windowTranslucentStatus = true

  4. कंटेनर गतिविधि को एंड्रॉइड के साथ मैनिफेस्ट में घोषित किया जाना चाहिए: windowSoftInputMode = "समायोजित करें" और घोषित विषय का उपयोग करें

  5. कृपया उपयोग करेंखंडे रूट लेआउट पर fitSystemWindows!

    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 के बारे में क्या? क्या आप इसके साथ मदद कर सकते हैं?
वी-रंड पुरो-हिट

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

मुझे एक ही समस्या थी, मेरी गतिविधि में मूल दृश्य के रूप में एक स्क्रॉल दृश्य था और पारदर्शी स्थिति पट्टी सक्रिय होने के साथ यह सही ढंग से आकार नहीं देता था जब कीबोर्ड दिखाया गया था ... और conseguently स्क्रीन स्क्रॉल दृश्य को छुपाने के लिए स्क्रॉल नहीं किया था।

समाधान: एक नए टुकड़े के अंदर सब कुछ (लेआउट और गतिविधि तर्क) स्थानांतरित कर दिया। फिर गतिविधि को केवल इस फ़्रैगमेंट में शामिल करने के लिए बदल दिया। अब सब कुछ उम्मीद के मुताबिक काम करता है!

यह गतिविधि का लेआउट है:

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

एंड्रॉइड में जोसेफ जॉनसन के वर्कअराउंड के आधार पर सॉफ्टकीबोर्ड दिखाई देने पर लेआउट को फुल स्क्रीन मोड में कैसे समायोजित करें

अपनी गतिविधि के 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;
}

}

2

यह पारभासी स्थिति पट्टी के साथ काम नहीं करना चाहिए; यह सेटिंग विंडो को फुलस्क्रीन मोड में लाने के लिए बाध्य करती है जो कि समायोजन के साथ काम नहीं करती है।

आप या तो एडजस्टमेंट का उपयोग कर सकते हैं या फिर फिट बैठता है। मैं इस सुविधा के बारे में पढ़ना चाहूंगा, हालांकि इसके महत्वपूर्ण दुष्प्रभाव हैं:

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


0

AndroidBug5497Workaround.java देखभाल स्मृति रिसाव। कोड के नीचे की जरूरत है

getViewTreeObserver().removeOnGlobalLayoutListener(listener);

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>

और मुझे जियांशु के ब्लॉग से मदद मिली । आप कोड को पढ़ सकते हैं लेकिन मेरे जैसे पाठ को। मैं कुछ और कोड जोड़ता हूं।

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>

मैं चाहता हूं कि यह आपके लिए उपयोगी हो। सौभाग्य!


कीबोर्ड को छिपाने और दिखाने में समय लगता है और लेआउट को पुश करने में भी समय लगता है। कोई भी समाधान ? कैसे प्रबंधन करना है ?
वंजारा स्वेता

0
  • के बाद मैंने सभी फोरम पर शोध किया था। थियोसे तरीके बिंदु को खोजने में मदद नहीं कर सकते हैं। भाग्यशाली जब मैंने इस तरह से करने की कोशिश की। यह मुझे समस्या हल करने में मदद करता है

एक्सएमएल

<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 (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 के महत्वपूर्ण हिस्से (उदाहरण के लिए, मैप्स एप्लिकेशन में अंतर्निहित नियंत्रण) सिस्टम बार द्वारा कवर किए जा रहे हैं। यह आपके ऐप को अनुपयोगी बना सकता है। ज्यादातर मामलों में आप इसे एंड्रॉइड को जोड़कर संभाल सकते हैं: आपकी XML लेआउट फ़ाइल में फिट बैठता है। यह सिस्टम विंडो के लिए स्पेस छोड़ने के लिए पैरेंट व्यूग्रुप की पैडिंग को समायोजित करता है। यह अधिकांश अनुप्रयोगों के लिए पर्याप्त है।

हालांकि, कुछ मामलों में, आपको अपने ऐप के लिए वांछित लेआउट प्राप्त करने के लिए डिफ़ॉल्ट पैडिंग को संशोधित करने की आवश्यकता हो सकती है। सीधे हेरफेर करने के लिए कि आपकी सामग्री सिस्टम बार (जो कि विंडो के "सामग्री इनसेट" के रूप में जानी जाने वाली जगह पर कब्जा करती है) के सापेक्ष कैसे लेट जाती है, फिटसिस्टवेयर विंडोज (रेक्ट इनसेट) को ओवरराइड करता है। 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.