উইন্ডোসফটআইনপুটমোড = "অ্যাডজাস্টারাইজ করুন" ট্রান্সলুসেন্ট অ্যাকশন / নাভবারের সাথে কাজ করছে না


129

নতুন অ্যান্ড্রয়েড কিটকাট (৪.৪) এবং এর মধ্যে ট্রান্সপ্লান্সেন্ট অ্যাকশনবার / নাবারের সাথে আমার সমস্যা আছে windowSoftInputMode="adjustResize"

সাধারনত ইনপুটমোডকে অ্যাডজাস্টের আকারে পরিবর্তন করা যায়, কীবোর্ড দেখানোর সাথে সাথে অ্যাপটিকে নিজেরাই পুনরায় আকার দেওয়া উচিত ... তবে এখানে এটি হবে না! আমি যদি স্বচ্ছ প্রভাবের জন্য লাইনগুলি মুছে ফেলি তবে পুনরায় আকারটি কাজ করছে।

সুতরাং যদি কীবোর্ডটি দৃশ্যমান হয় তবে আমার তালিকাগুলি এর নিচে রয়েছে এবং আমি শেষের কয়েকটি আইটেম অ্যাক্সেস করতে পারছি না। (কেবল কীবোর্ডটি ম্যানুয়ালি লুকিয়ে রেখে)

Andro আইডি

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

বিভাজন .xml লেআউট এর মূল RelativeLayoutমধ্যে ।

হালনাগাদ:

গত বছর ক্রিস বেনের একটি আকর্ষণীয় কথা ছিল যা এটি কীভাবে কাজ করে তা ভাল করে ব্যাখ্যা করে:

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


5
আমি মনে করি
এটির

1
তুমি আসল পুরুষ! আমি এই সমস্যাটি শুধুমাত্র ললিপপ সংস্করণে পেয়েছি এবং এটি ঠিক করেছে।
ডেভিড

6
@ ডেভিড এটি এখনও স্থির নয়, এখনও মার্শমেলো ডিভাইসে ব্রেক করছে, আপনি যদি কোনও ডায়লগ খুলেন এবং স্ক্রোল করার চেষ্টা করেন তবে সফটকেবোর্ডটি স্ক্রোলিংটি ব্লক করে দেবে
বাইটকোড

5
এটি কাজ করে, তবে আমার সরঞ্জামদণ্ড এবং স্ট্যাটাসবার কাস্টমাইজেশনের সাথে দ্বন্দ্ব
নিনজা

2
কাজ করে তবে স্ট্যাটাস বারটি আর কোনও স্বচ্ছ হয় না। আমি লেআউটটি পুরো স্ক্রিনটি কভার করতে চাই।
htafoya

34

এখানে সম্পর্কিত একটি বাগ রিপোর্ট রয়েছে । সীমাবদ্ধ পরীক্ষা করা থেকে মনে হয় যে কোনও কৌশল ছাড়াই কৌশলটি করা হয়েছে বলে মনে হচ্ছে work আপনার মূলের একটি কাস্টম বাস্তবায়ন যুক্ত করুন ViewGroup(আমি প্রায় সবসময় ব্যবহার করি FrameLayout, তাই এটির সাথে আমি পরীক্ষা করেছি) নীচের যুক্তি দিয়ে। তারপরে, আপনার রুট বিন্যাসের জায়গায় এই কাস্টম বিন্যাসটি ব্যবহার করুন এবং আপনি সেট করেছেন তা নিশ্চিত করুন android:fitsSystemWindows="true"। তারপরে আপনি আপনার লেআউটটির বাকি অংশটি সিস্টেমের ইনসেটগুলির অ্যাকাউন্টে সামঞ্জস্য করতে getInsets()লেআউট (যেমন একটি যুক্ত করুন OnPreDrawListener) এর পরে কেবল কল করতে পারেন desired

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 আমার অভিজ্ঞতা অনুসারে উপেক্ষা করা হবে না বলে মনে হচ্ছে - এটি সিস্টেম বার এবং শিফট কীবোর্ড সহ ফোকাসযুক্ত দৃশ্যের অধীনে পুরো স্ক্রিনটিকে সরিয়ে ফেলবে।
sealskej

ধন্যবাদ - আপনি SOFT_INPUT_ADJUST_PAN সম্পর্কে সঠিক। আমি এটি আমার টুকরোটিতে ব্যবহার করেছি: getActivity ()। GetWindow ()। SetSoftInputMode (উইন্ডো ম্যানেজ.লয়আউটপ্যারামস.স.ফ.আইএনপিইউT_ADJUST_PAN);
সাইমন

ক্রিয়াকলাপের জন্য অ্যাডজাস্ট্রাইজ করা (কীবোর্ড দেখানোর পরে ভিউ স্ক্রোলিংয়ের জন্য প্রয়োজনীয়), ফিটসিসটেম উইন্ডোসকে সত্য হিসাবে সেট করা হলে আমি স্ক্রোলটি আসলে> = ললিপপ এবং ট্রান্সলুসেন্ট স্ট্যাটাস বারের সাথে ঘটে তাই একমাত্র উপায়। অনেক ধন্যবাদ.
লুকাস

এটিই আসল সমাধান
9:30 তে শহীদগ্লাবিটজ

কীবোর্ডটি দেখানো এবং লুকিয়ে রাখতে সময় লাগে এমনকি লেআউটটিকে উপরে তুলতে সময়ও লাগে। কোন সমাধান?
ভানজারা সোয়েতা

28

@ কেকপপক উত্তরটি সত্যই সহায়ক, তবে ফিটসিসটেম উইন্ডোগুলি এপিআই স্তরের 20 তে অবনমিত হয়েছে

সুতরাং API 20 (KITKAT_WATCH) যেহেতু আপনার অ্যাপ্লাই উইন্ডো ইনসেটগুলি ওভাররাইড করা উচিত

@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

আপনি কেন এমসেটস অ্যারে উপাদানগুলি ব্যবহার না করা অবস্থায় সেট করেছেন তা আমার কোনও ধারণা নেই তবে এটি কাজ করে
বাক্সস্টাব্যু

1
আপনার সংস্করণ পরিবর্তে পরীক্ষা আপনি ব্যবহার করতে পারেনViewCompat.setOnApplyWindowInsetsListener
repitch

আমি এই কাজটি পেতে পারি না, তবে dispatchApplyWindowInsetsপরিবর্তে (একই কোড) আমার জন্য কাজ করেছিল
পেটার

11

এটি আমার পক্ষে স্বচ্ছ স্ট্যাটাস বার রাখার এবং খণ্ডে পুনরায় আকার দেওয়ার জন্য কাজ করেছে:

  1. @ ভিক্টর 91 এবং @ কেকপপক যেমনটি বলেছে তেমন একটি কাস্টম রিলেটিভলআউট করুন।

  2. আপনার টুকরাটির জন্য কাস্টমরিলেটিভ লেআউটটিকে প্যারেন্ট লেআউট হিসাবে ব্যবহার করুন।

  3. অ্যান্ড্রয়েডের সাথে থিম ঘোষণা করুন: উইন্ডো ট্রান্সলুসেন্টস্ট্যাটাস = সত্য

  4. ধারক ক্রিয়াকলাপটি অবশ্যই অ্যান্ড্রয়েডের সাথে ম্যানিফেস্টে ঘোষণা করতে হবে: উইন্ডোসোফটইনপুটমোড = "অ্যাডজাস্টারাইজাইজ করুন" এবং ঘোষিত থিমটি ব্যবহার করুন

  5. টুকরা রুট বিন্যাসে ফিটসিসটেম উইন্ডো ব্যবহার করুন!

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

তারপরে এক্সএমএল এ,

<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
এটি এখন পর্যন্ত সেরা উত্তর, এবং আমি কিছু সময়ের জন্য সমাধান খুঁজছি। এটি নিখুঁতভাবে কাজ করছে, তবে আপনাকে নিজের সরঞ্জামদণ্ডে কিছু অতিরিক্ত প্যাডিং যুক্ত করতে হবে, এটি ছাড়া আপনার সরঞ্জামদণ্ড স্ট্যাটাস
বারের

উইন্ডো ট্রান্সলুসেন্টন্যাভিগেশন সম্পর্কে কী? আপনি যে সাহায্য করতে পারেন?
ভি-রুন্ড পুরো-হিট

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- ਵੰਤ- to- Fitssystemwindows- 4e26d9ce1eec https://medium.com/@azizbekian/windowinsets-24e241d4afb9


1
এটি এখনও সর্বোত্তম পন্থা হিসাবে রয়ে গেছে, যেহেতু আপনি এটি প্রয়োগ করতে পারেন BaseFragmentপাশাপাশি view.fitsSystemWindows = trueএটি আপনার প্রকৃত এক্সএমএল লেআউট বা ভিউ সাবক্লাসে কোনও পরিবর্তন ছাড়াই কাজ করে।
বোগদান জুরাক

5

আমার একই সমস্যা ছিল, আমার ক্রিয়াকলাপটি রুট ভিউ হিসাবে একটি স্ক্রোলভিউ ছিল এবং স্বচ্ছ স্ট্যাটাসবারটি সক্রিয়করণের সাথে কীবোর্ড দেখানোর সময় এটি সঠিকভাবে আকার পরিবর্তন করতে পারেনি ... এবং ফলস্বরূপ স্ক্রিনটি ইনপুট ভিউগুলি লুকিয়ে রাখেনি।

সমাধান: নতুন ফ্রেগমেন্টের ভিতরে সমস্ত কিছু (লেআউট এবং ক্রিয়াকলাপ যুক্তি) সরানো হয়েছে। তারপরে ক্রিয়াকলাপটি কেবলমাত্র এই টুকরোটি অন্তর্ভুক্ত করতে পরিবর্তন করা হয়েছে। এখন প্রত্যাশার মতো সবকিছুই কাজ করে!

এটি কার্যকলাপের বিন্যাস:

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

আমার জন্য
কবজির

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

AndroidBug5497Warkaround.java যত্ন নিন মেমরি ফাঁস। কোড নীচে প্রয়োজন

getViewTreeObserver().removeOnGlobalLayoutListener(listener);

আরএক্সজাভা ব্যবহার করে আমার নমুনা যা ক্রিয়াকলাপের জীবনচক্রের অনপস () অন্বেষণ করার পরে স্বয়ংক্রিয়ভাবে অপসারণ কল করে

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

আমার একটা সমস্যা ছিল

আমি উইন্ডো ড্রসসিসটেমবারব্যাকগ্রাউন্ডগুলি 'সত্য' তে সেট করেছি এবং আমার অ্যাপ্লিকেশনটি স্ট্যাটাস বারের নীচে প্রদর্শিত হবে।

এটি আমার ক্রিয়াকলাপের থিম।

<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
  • আমি সমস্ত ফোরামে গবেষণা করার পরে। thoese উপায় বিন্দু খুঁজে সাহায্য করতে পারে না। ভাগ্যবান যখন আমি এইভাবে করার চেষ্টা করেছি। এটি আমার সমস্যার সমাধান করতে সহায়তা করে

এক্সএমএল

<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"*/
}

অবশেষে আপনার মূল বক্তব্যটিতে কিছু লাইন যুক্ত করা

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

আপনি যখন এই পদ্ধতির ব্যবহার করেন, আপনার অ্যাপের ইউআইয়ের সমালোচনাপূর্ণ অংশগুলি (উদাহরণস্বরূপ, মানচিত্রের অ্যাপ্লিকেশনটিতে অন্তর্নির্মিত নিয়ন্ত্রণগুলি) সিস্টেম বার দ্বারা আচ্ছাদিত না হয়ে থাকে তা নিশ্চিত করা আপনার দায়িত্ব হয়ে যায়। এটি আপনার অ্যাপটিকে অকেজো করতে পারে। বেশিরভাগ ক্ষেত্রে আপনি এন্ড্রয়েড যুক্ত করে এটি পরিচালনা করতে পারেন: ফিটসিসটেম উইন্ডোস আপনার এক্সএমএল লেআউট ফাইলটিতে অ্যাট্রিবিউট, সত্য হিসাবে সেট করা। এটি সিস্টেম উইন্ডোগুলির জন্য স্থান ছাড়তে পিতামাতার ভিউগ্রুপের প্যাডিং সামঞ্জস্য করে। বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য এটি যথেষ্ট।

তবে কিছু ক্ষেত্রে আপনার অ্যাপ্লিকেশনটির জন্য পছন্দসই বিন্যাসটি পেতে আপনার ডিফল্ট প্যাডিংটি পরিবর্তন করতে হবে। আপনার সামগ্রীগুলি কীভাবে সিস্টেম বারগুলির সাথে সম্পর্কিত হয় (যা উইন্ডোর "সামগ্রী ইনসেট" নামে পরিচিত একটি স্থান দখল করে) সরাসরি পরিচালনা করতে, ফিটসিসটর্ম উইন্ডোস (রেক্ট ইনসেট) ওভাররাইড করে। উইন্ডোটির বিষয়বস্তু ইনসেটগুলি পরিবর্তিত হয়ে উইন্ডোটিকে তার বিষয়বস্তু অনুসারে সামঞ্জস্য করতে মঞ্জুরি দেওয়ার জন্য ফিট সিস্টেমটি উইন্ডো () পদ্ধতিটি ভিউ হায়ারার্কি বলে। আপনি চাইলে এই পদ্ধতিটি ওভাররাইড করে আপনি ইনসেটগুলি (এবং তাই আপনার অ্যাপ্লিকেশনটির বিন্যাস) পরিচালনা করতে পারেন।

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> অ্যান্ড্রয়েড 5 তে পতাকা সামগ্রীটি স্ক্রোলযোগ্য হবে না এবং কীবোর্ডের সাথে ওভারল্যাপ হবে।

এই সমস্যাটি সমাধান করার জন্য এই উত্তরটি পরীক্ষা করে দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.