অ্যান্ড্রয়েড যখন সফ্টওয়্যারবোর্ডটি দৃশ্যমান থাকে তখন ফুল স্ক্রিন মোডে লেআউট কীভাবে সামঞ্জস্য করবেন


178

সফটকিবোর্ড সক্রিয় থাকাকালীন আমি লেআউটটি সামঞ্জস্য করার জন্য অনেক গবেষণা করেছি এবং আমি এটি সফলভাবে প্রয়োগ করেছি তবে যখন আমি android:theme="@android:style/Theme.NoTitleBar.Fullscreen"ম্যানিফেস্ট ফাইলটিতে আমার ক্রিয়াকলাপটিতে এটি ব্যবহার করি তখন সমস্যাটি আসে ।

এর জন্য আমি android:windowSoftInputMode="adjustPan|adjustResize|stateHidden"বিভিন্ন বিকল্প ব্যবহার করেছি তবে ভাগ্য নেই।

এর পরে আমি FullScreenপ্রোগ্রামটিমেটিকভাবে প্রয়োগ করেছি এবং বিভিন্ন লেআউট দিয়ে কাজ করার চেষ্টা করেছি FullScreenতবে সব বৃথা গেল।

আমি এই লিঙ্কগুলি উল্লেখ করেছি এবং এই সমস্যা সম্পর্কিত এখানে অনেকগুলি পোস্ট দেখেছি:

http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html

http://davidwparker.com/2011/08/30/android-how-to-float-a-row-above-keyboard/

এখানে এক্সএমএল কোড রয়েছে:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/masterContainerView"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="#ffffff">

    <ScrollView android:id="@+id/parentScrollView"
        android:layout_width="fill_parent" android:layout_height="wrap_content">

        <LinearLayout android:layout_width="fill_parent"
            android:layout_height="fill_parent" android:orientation="vertical">

            <TextView android:id="@+id/setup_txt" android:layout_width="wrap_content"
                android:layout_height="wrap_content" android:text="Setup - Step 1 of 3"
                android:textColor="@color/top_header_txt_color" android:textSize="20dp"
                android:padding="8dp" android:gravity="center_horizontal" />

            <TextView android:id="@+id/txt_header" android:layout_width="fill_parent"
                android:layout_height="40dp" android:text="AutoReply:"
                android:textColor="@color/top_header_txt_color" android:textSize="14dp"
                android:textStyle="bold" android:padding="10dp"
                android:layout_below="@+id/setup_txt" />

            <EditText android:id="@+id/edit_message"
                android:layout_width="fill_parent" android:layout_height="wrap_content"
                android:text="Some text here." android:textSize="16dp"
                android:textColor="@color/setting_editmsg_color" android:padding="10dp"
                android:minLines="5" android:maxLines="6" android:layout_below="@+id/txt_header"
                android:gravity="top" android:scrollbars="vertical"
                android:maxLength="132" />

            <ImageView android:id="@+id/image_bottom"
                android:layout_width="fill_parent" android:layout_height="wrap_content"
                android:layout_below="@+id/edit_message" />

        </LinearLayout>
    </ScrollView>

    <RelativeLayout android:id="@+id/scoringContainerView"
        android:layout_width="fill_parent" android:layout_height="50px"
        android:orientation="vertical" android:layout_alignParentBottom="true"
        android:background="#535254">

        <Button android:id="@+id/btn_save" android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:layout_alignParentRight="true"
            android:layout_marginTop="7dp" android:layout_marginRight="15dp"
            android:layout_below="@+id/edit_message"
            android:text = "Save" />

        <Button android:id="@+id/btn_cancel" android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:layout_marginTop="7dp"
            android:layout_marginRight="10dp" android:layout_below="@+id/edit_message"
            android:layout_toLeftOf="@+id/btn_save" android:text = "Cancel" />

    </RelativeLayout>
</RelativeLayout>

এখানে চিত্র বর্ণনা লিখুন

আমি চাই সফটকিবোর্ড ছবিতে এলে নীচের 2 টি বোতামটি উপরের দিকে চলে উচিত।

এখানে চিত্র বর্ণনা লিখুন


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

আমি ইতিমধ্যে অনেকগুলি অপশন চেষ্টা করেছি যা কার্যকর হয় না ...
ভিনিত শুক্ল

1
আপনার বোতামগুলি একটি ফ্রেমআলেটে রাখুন এবং ফ্রেমলআউটটির ওজন 1 এ সেট করুন এবং অবশেষে কেবল android:windowSoftInputMode="adjustPan"এই কাজটি আমাকে বলুন ..
শেরিফ এলখতিব

@ ভিনিটশুকলা আপনি কি পুরো পর্দার সাথে কোনও কাজ খুঁজে পেয়েছেন ??
মুহাম্মদ বাবর

2
খেয়াল করুন যে আপনার adjustResizeএবং adjustPanএকই সময়ে, জাভাদোক থেকে ব্যবহার করা উচিত নয় android.view.WindowManager.LayoutParams#SOFT_INPUT_ADJUST_RESIZE: "এটি l @ লিঙ্ক এসওফT_INPUT_ADJUST_PAN with এর সাথে একত্রিত করা যায় না"
ডেনিস নিয়াজহেভ

উত্তর:


257

ইয়েগমের কাজের ভিত্তিতে, আমি একটি সুবিধাযুক্ত ক্লাস কোড করেছিলাম যা আমাকে ওয়ান-লাইনার (আমার উত্সের কোডটিতে নতুন ক্লাস যুক্ত করার পরে) দিয়ে সমস্যার সমাধান করতে দেয়। ওয়ান-লাইনারটি হ'ল:

     AndroidBug5497Workaround.assistActivity(this);

এবং বাস্তবায়ন ক্লাসটি হ'ল:


public class AndroidBug5497Workaround {

    // For more information, see https://issuetracker.google.com/issues/36911528
    // 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 - r.top);
    }
}

আশা করি এটি কাউকে সাহায্য করবে।


8
ধন্যবাদ! কেন আমার কোনও ধারণা নেই তবে এটি আমার এইচটিসি ওয়ান মিনিতে কাজ করার জন্য আমার return (r.bottom - r.top); সাথে প্রতিস্থাপন করতে হয়েছিল return r.bottom, অন্যথায় স্থিতি বারের আকারের সাথে ক্রিয়াকলাপের দৃশ্যটি খুব বেশি চাপ দেওয়া হবে। যদিও আমি এটি এখনও অন্য ডিভাইসে পরীক্ষা করেছি না। আশা করি যে সাহায্য করতে পারে।
জোয়ান

4
হাই জোসেফ জনসন, আমি আপনার কোড ব্যবহার করেছি এবং এটি পুরোপুরি কার্যকর হয়েছে। তবে এখন কয়েকটি ছোট ডিভাইসে সমস্যার মুখোমুখি হ'ল এটি কীবোর্ড এবং বিন্যাসের মধ্যে ফাঁক (ফাঁকা স্ক্রিন) দেখায়। এই সমস্যা সম্পর্কে আপনার কোনও ধারণা আছে? আমি r.bottom ফেরত দেওয়ার চেষ্টা করেছি।
পঙ্কজ

2
জোসেফ জনসন: আমি যখন আপনার শীর্ষ সম্পাদনা পাঠ্যের উপরে ক্লিক করি তখন আমি আপনার পদ্ধতিটি কার্যকর করেছি, ঠিক আছে তবে আমরা নীচের সম্পাদনাতে ক্লিক করলে সমস্ত নকশা উঠে যায়
রঞ্জিত

3
দুর্ভাগ্যক্রমে এটি Nexus 7 (2013) এ কাজ করে না। এটি এখনও সামঞ্জস্যহীন কিছু সেট সহ প্যান করে।
লে-রো স্টেইনস

4
দুর্দান্ত উত্তর, আপনাকে অনেক ধন্যবাদ। এটি একটি নেক্সাস 6 এ কাজ করছে তবে এর পরিবর্তে আমাকে frameLayoutParams.height = usableHeightSansKeyboard;ব্যবহার করতে হবে frameLayoutParams.height = usableHeightNow;যদি আমি এটি না করি তবে কিছু উপাদানগুলি পর্দার বাইরে পড়ে।
রবার্তো অ্যালেন্ডে

36

যেহেতু উত্তরটি ইতিমধ্যে বাছাই করা হয়েছে এবং সমস্যাটি বাগ হিসাবে পরিচিত, তাই আমি ভেবেছিলাম যে আমি একটি "সম্ভাব্য কাজের আশেপাশে" যুক্ত করব।

নরম কীবোর্ড প্রদর্শিত হলে আপনি পূর্ণ স্ক্রিন মোড টগল করতে পারেন। এটি "অ্যাডজাস্টপ্যান" কে সঠিকভাবে কাজ করতে দেয়।

অন্য কথায়, আমি এখনও @ অ্যান্ড্রয়েড: শৈলী / থিম.ব্ল্যাক.নোটিটলবার.ফুলস্ক্রিনটি অ্যাপ্লিকেশন থিমের অংশ হিসাবে এবং স্টেটভিজিবল | অ্যাডজাস্ট্রয়েটরিভিটি উইন্ডো সফ্ট ইনপুট মোডের অংশ হিসাবে পুনরায় আকার দিন তবে তাদের একসাথে কাজ করতে আমাকে অবশ্যই পূর্ণস্ক্রিন মোড টগল করতে হবে কীবোর্ড আসার আগে

নিম্নলিখিত কোড ব্যবহার করুন:

পূর্ণ স্ক্রিন মোডটি বন্ধ করুন

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

পূর্ণ স্ক্রিন মোড চালু করুন

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

দ্রষ্টব্য - অনুপ্রেরণা এসেছে: একটি পূর্ণস্ক্রিন মোডে শিরোনাম লুকিয়ে


1
আমি প্রশংসা করি যে আপনি সমস্যার জন্য সময় দিয়েছেন, এটির জন্য +1। আমি অবশ্যই এই পদ্ধতির পরীক্ষা করব এবং শীঘ্রই আপনাকে জানাতে পারি যদি এটি আমার জন্য কাজ করে, ধন্যবাদ।
ভিনিত শুক্লা

1
সন্দেহ হিসাবে কাজ করছে! সত্যিই ভাল সমাধান! আমার পক্ষ থেকে +1
মাইক


কীবোর্ডটি স্ন্যাপ করে কীবোর্ডের পটভূমিকে কালো করে তোলে।
স্নেপিংয়ের প্রভাবটি

ঘেউ ধন্যবাদ ... এটা মিশ্রন কার্যসংক্রান্ত AndroidBug5497Workaround উল্লেখ দ্বারা সত্যিই ভাল আমার জন্য কাজ করে ... আমি GitHub ... সম্মিলিত উৎস আপলোড github.com/CrandellWS/AndroidBug5497Workaround/blob/master/...
CrandellWS

23

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

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

  1. বিশ্বব্যাপী বিন্যাস শ্রোতা
  2. প্যানিং
  3. সামগ্রীর বিন্যাস (= সামগ্রীর প্রকৃত আকার পরিবর্তন)

প্যানিং অক্ষম করা সম্ভব নয়, তবে সামগ্রীর উচ্চতা পরিবর্তন করে প্যানটিকে অফসেটটিকে 0 হতে বাধ্য করা সম্ভব। এটি শ্রোতার ক্ষেত্রে করা যেতে পারে, কারণ প্যানিংয়ের আগে এটি চালানো হয়। সামগ্রীটির উচ্চতাটি উপলভ্য উচ্চতার জন্য নির্ধারণ করা কোনও মসৃণ ব্যবহারকারীর অভিজ্ঞতার ফলস্বরূপ, কোনও ঝাঁকুনি নয়।

আমিও এই পরিবর্তনগুলি করেছি। এর মধ্যে যদি কোনও সমস্যার সমাধান করে তবে আমাকে জানান:

  • ব্যবহারের জন্য উপলব্ধ উচ্চতার স্থিতিশীল স্থিরতা getWindowVisibleDisplayFrameRectঅপ্রয়োজনীয় আবর্জনা একটি সামান্য বিট প্রতিরোধ সংরক্ষিত করা হয়েছে।
  • শ্রোতাদেরও সরানোর অনুমতি দিন। আপনি যখন বিভিন্ন পূর্ণ-স্ক্রিনের প্রয়োজনীয়তা থাকা বিভিন্ন টুকরো জন্য কোনও ক্রিয়াকলাপ পুনরায় ব্যবহার করেন তখন এটি কার্যকর।
  • প্রদর্শিত বা লুকানো কীবোর্ডের মধ্যে পার্থক্য করবেন না, তবে সর্বদা সামগ্রীটির উচ্চতাটি দৃশ্যমান ডিসপ্লে ফ্রেমের উচ্চতায় সেট করুন।

এটি একটি নেক্সাস 5 এ পরীক্ষা করা হয়েছে, এবং 16-24 এআইপি লেভেলগুলি ছোট থেকে বড় পর্যন্ত স্ক্রিনের আকারের সাথে চলছে em

কোডটি কোটলিনে পোর্ট করা হয়েছে তবে জাভাতে আমার পরিবর্তনগুলি পোর্ট করা সহজ। আপনার সাহায্যের প্রয়োজন হলে আমাকে জানান:

class AndroidBug5497Workaround constructor(activity: Activity) {
    private val contentContainer = activity.findViewById(android.R.id.content) as ViewGroup
    private val rootView = contentContainer.getChildAt(0)
    private val rootViewLayout = rootView.layoutParams as FrameLayout.LayoutParams
    private val viewTreeObserver = rootView.viewTreeObserver
    private val listener = ViewTreeObserver.OnGlobalLayoutListener { possiblyResizeChildOfContent() }

    private val contentAreaOfWindowBounds = Rect()
    private var usableHeightPrevious = 0

    // I call this in "onResume()" of my fragment
    fun addListener() {
        viewTreeObserver.addOnGlobalLayoutListener(listener)
    }

    // I call this in "onPause()" of my fragment
    fun removeListener() {
        viewTreeObserver.removeOnGlobalLayoutListener(listener)
    }

    private fun possiblyResizeChildOfContent() {
        contentContainer.getWindowVisibleDisplayFrame(contentAreaOfWindowBounds)
        val usableHeightNow = contentAreaOfWindowBounds.height()
        if (usableHeightNow != usableHeightPrevious) {
            rootViewLayout.height = usableHeightNow
            // Change the bounds of the root view to prevent gap between keyboard and content, and top of content positioned above top screen edge.
            rootView.layout(contentAreaOfWindowBounds.left, contentAreaOfWindowBounds.top, contentAreaOfWindowBounds.right, contentAreaOfWindowBounds.bottom)
            rootView.requestLayout()

            usableHeightPrevious = usableHeightNow
        }
    }
}

9
এটি সেরা উত্তর বলে মনে হচ্ছে। আমি এখানে জাভাতে পোর্ট করেছি gist.github.com/grennis/2e3cd5f7a9238c59861015ce0a7c5584 । দ্রষ্টব্য আমি ব্যতিক্রম পাচ্ছিলাম যে পর্যবেক্ষক বেঁচে নেই, পাশাপাশি এটিও পরীক্ষা করে দেখতে হয়েছিল।
গ্রেগ এনিস

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

1
@ গ্রেগ এনিস জাভা বন্দরের জন্য ধন্যবাদ। প্রচুর পরিশ্রম ও সময় বাঁচিয়েছে।
ইকুন

@ গ্রেগইনিস, ধন্যবাদ, আপনার সমাধানটি রিসুম (), অনপজ (), অনডস্ট্রয় () (গিটহাব কোডে মন্তব্য দেখুন) এর সাথে কাজ করে।
কুলমাইন্ড

এটি আমার জন্য কাজ করছে, অপসারণলিস্টনার কলটি কাজ করছে বলে মনে হচ্ছে না। আমি possiblyResizeChildOfContentকল এবং কল উভয়ের ভিতরে ব্রেকপয়েন্টগুলি রেখেছি removeListenerএবং আমি removeListenerব্রেকপয়েন্টে আঘাত করার possiblyResizeChildOfContentপরেও এখনও কল করা হচ্ছে। অন্য কেউ এই সমস্যা আছে?
কুইন

14

আপনি যদি সিস্টেম UI পদ্ধতির ( https://developer.android.com/training/system-ui/immersive.html ) ব্যবহার করে থাকেন তবে আমি কেবল একটি সহজ এবং নির্ভরযোগ্য সমাধান পেয়েছি ।

আপনি যখন ব্যবহার করছেন এটি ক্ষেত্রে এটি কাজ করে View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN, যেমন আপনি যদি ব্যবহার করছেন CoordinatorLayout

এটি WindowManager.LayoutParams.FLAG_FULLSCREEN(যার সাথে থিম আপনি সেট করতে পারেন) এর পক্ষেও android:windowFullscreenকার্যকর হবে না তবে আপনি ডকস অনুসারেSYSTEM_UI_FLAG_LAYOUT_STABLE (যা "একই দৃষ্টিভঙ্গি প্রভাব ফেলেছে" ) এর সাথে একইরকম প্রভাব অর্জন করতে পারেন এবং এই সমাধানটি আবার কাজ করা উচিত।

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION /* If you want to hide navigation */
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE)

আমি এটি আমার ডিভাইসে মার্শমালো চালিয়ে পরীক্ষা করেছি।

মূলটি হ'ল সফট কীবোর্ডগুলিও সিস্টেম উইন্ডোগুলির মধ্যে একটি (যেমন স্থিতি দণ্ড এবং নেভিগেশন বার), তাই WindowInsetsসিস্টেম দ্বারা প্রেরণ করা সম্পর্কে এটি সম্পর্কে সঠিক এবং নির্ভরযোগ্য তথ্য রয়েছে।

ব্যবহারের ক্ষেত্রে যেমন DrawerLayoutআমরা যেখানে স্ট্যাটাস বারের পিছনে আঁকতে চেষ্টা করছি সেখানে আমরা এমন একটি বিন্যাস তৈরি করতে পারি যা কেবলমাত্র শীর্ষের ইনসেটটিকে উপেক্ষা করে এবং নীচের ইনসেটটি প্রয়োগ করে যা নরম কীবোর্ডের জন্য অ্যাকাউন্ট করে।

আমার প্রথাটি এখানে FrameLayout:

/**
 * Implements an effect similar to {@code android:fitsSystemWindows="true"} on Lollipop or higher,
 * except ignoring the top system window inset. {@code android:fitsSystemWindows="true"} does not
 * and should not be set on this layout.
 */
public class FitsSystemWindowsExceptTopFrameLayout extends FrameLayout {

    public FitsSystemWindowsExceptTopFrameLayout(Context context) {
        super(context);
    }

    public FitsSystemWindowsExceptTopFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FitsSystemWindowsExceptTopFrameLayout(Context context, AttributeSet attrs,
                                                 int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    public FitsSystemWindowsExceptTopFrameLayout(Context context, AttributeSet attrs,
                                                 int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public WindowInsets onApplyWindowInsets(WindowInsets insets) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            setPadding(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(),
                    insets.getSystemWindowInsetBottom());
            return insets.replaceSystemWindowInsets(0, insets.getSystemWindowInsetTop(), 0, 0);
        } else {
            return super.onApplyWindowInsets(insets);
        }
    }
}

এবং এটি ব্যবহার করতে:

<com.example.yourapplication.FitsSystemWindowsExceptTopFrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Your original layout here -->
</com.example.yourapplication.FitsSystemWindowsExceptTopFrameLayout>

এটি তাত্ত্বিকভাবে পাগল পরিবর্তন ছাড়াই যে কোনও ডিভাইসের জন্য কাজ করা উচিত, কোনও হ্যাকের চেয়ে অনেক ভাল যা রেফারেন্স হিসাবে 1/3বা 1/4স্ক্রিন আকারের রেফারেন্স হিসাবে গ্রহণ করার চেষ্টা করে ।

(এটির জন্য এআইপি 16+ প্রয়োজন, তবে আমি স্ট্যাটাস বারের পিছনে আঁকতে শুধুমাত্র ললিপপ + এ ফুলস্ক্রিন ব্যবহার করি যাতে এটি এই ক্ষেত্রে সেরা সমাধান)


@ ডিলিপ এটি এআইপি 16+ এ কাজ করে, তবে শর্ত থাকে যে পূর্বোক্ত শর্তগুলি পূরণ হয়।
হাই জাং

10

দয়া করে মনে রাখবেন যে android:windowSoftInputMode="adjustResize"কোনও WindowManager.LayoutParams.FLAG_FULLSCREENক্রিয়াকলাপের জন্য সেট করা থাকলে তা কাজ করে না । আপনার কাছে দুটি বিকল্প রয়েছে।

  1. হয় আপনার ক্রিয়াকলাপের জন্য পূর্ণস্ক্রিন মোড অক্ষম করুন। ক্রিয়াকলাপটি পূর্ণস্ক্রিন মোডে পুনরায় আকারের হয় না। আপনি এটি এক্সএমএল (ক্রিয়াকলাপের থিম পরিবর্তন করে) বা জাভা কোডে করতে পারেন। আপনার অনক্রিট () পদ্ধতিতে নিম্নলিখিত লাইনগুলি যুক্ত করুন।

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);   
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);`

অথবা

  1. পূর্ণস্ক্রিন মোড অর্জনের জন্য বিকল্প উপায় ব্যবহার করুন। আপনার অনক্রিট () পদ্ধতিতে নিম্নলিখিত কোড যুক্ত করুন।

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
    View decorView = getWindow().getDecorView();
    // Hide the status bar.
    int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
    decorView.setSystemUiVisibility(uiOptions);`

দয়া করে নোট করুন যে পদ্ধতি -2 কেবল অ্যান্ড্রয়েড 4.1 এবং তার উপরের কাজ করে।


@ আনশুলত্যাগি পদ্ধতি -২ কেবলমাত্র অ্যান্ড্রয়েড ৪.১ এবং তারপরে কাজ করে।
অভিনব চৌহান

4
যথাক্রমে ৫.০ এবং ৪.৪.২, নেক্সাস 9 এবং স্যামসাং এস 4 এ পরীক্ষিত, দ্বিতীয় পদ্ধতিটি কাজ করে না।
রবভয়েসি

1
2 য় পদ্ধতিটি কেবল কাজ করে না এবং আমি এতে অনেক সময় নষ্ট করি।
গ্রেগ এনিস

ধন্যবাদ, আমার দিন বাঁচাও
ডেনি রোহিমাত

9

আমাকেও এই সমস্যার মুখোমুখি হতে হয়েছিল এবং একটি কাজ ছিল যার চারপাশে আমি এইচটিসি ওয়ান, গ্যালাক্সি এস 1, এস 2, এস 3, নোট এবং এইচটিসি সংবেদন পরীক্ষা করেছিলাম।

আপনার লেআউটের মূল দৃশ্যে একটি বিশ্বব্যাপী বিন্যাস শ্রোতা রাখুন

mRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){
            public void onGlobalLayout() {
                checkHeightDifference();
            }
    });

এবং সেখানে আমি উচ্চতার পার্থক্যটি যাচাই করেছি এবং যদি পর্দার উচ্চতার পার্থক্য বড় হয় তবে স্ক্রিনের উচ্চতায় তৃতীয়াংশ পরে আমরা ধরে নিতে পারি কীবোর্ডটি খোলা আছে। এই উত্তর থেকে এটি গ্রহণ ।

private void checkHeightDifference(){
    // get screen frame rectangle 
    Rect r = new Rect();
    mRootView.getWindowVisibleDisplayFrame(r);
    // get screen height
    int screenHeight = mRootView.getRootView().getHeight();
    // calculate the height difference
    int heightDifference = screenHeight - (r.bottom - r.top);

    // if height difference is different then the last height difference and
    // is bigger then a third of the screen we can assume the keyboard is open
    if (heightDifference > screenHeight/3 && heightDifference != mLastHeightDifferece) {
        // keyboard visiblevisible
        // get root view layout params
        FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mRootView.getLayoutParams();
        // set the root view height to screen height minus the height difference
        lp.height = screenHeight - heightDifference;
        // call request layout so the changes will take affect
        .requestLayout();
        // save the height difference so we will run this code only when a change occurs.
        mLastHeightDifferece = heightDifference;
    } else if (heightDifference != mLastHeightDifferece) {
        // keyboard hidden
        PFLog.d("[ChatroomActivity] checkHeightDifference keyboard hidden");
        // get root view layout params and reset all the changes we have made when the keyboard opened.
        FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mRootView.getLayoutParams();
        lp.height = screenHeight;
        // call request layout so the changes will take affect
        mRootView.requestLayout();
        // save the height difference so we will run this code only when a change occurs.
        mLastHeightDifferece = heightDifference;
    }
}

এটি সম্ভবত বুলেট প্রুফ নয় এবং সম্ভবত কিছু ডিভাইসে এটি কাজ করবে না তবে এটি আমার পক্ষে কাজ করেছে এবং আশা করি এটি আপনাকেও সহায়তা করবে।


1
কিছু সমন্বয় প্রয়োজন, কিন্তু এটি কার্যকর। নেক্সাস 7 2013 এ আমাকে কিছু পিক্সেল দ্বারা কীবোর্ডের উচ্চতা (স্ক্রিন হাইট / 3) হ্রাস করতে হয়েছিল। ভাল ধারণা, ধন্যবাদ!
জোওও সওসা

7

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

    //when the application uses full screen theme and the keyboard is shown the content not scrollable! 
//with this util it will be scrollable once again
//http://stackoverflow.com/questions/7417123/android-how-to-adjust-layout-in-full-screen-mode-when-softkeyboard-is-visible
public class AndroidBug5497Workaround {


    private static AndroidBug5497Workaround mInstance = null;
    private View mChildOfContent;
    private int usableHeightPrevious;
    private FrameLayout.LayoutParams frameLayoutParams;
    private ViewTreeObserver.OnGlobalLayoutListener _globalListener;

    // 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 AndroidBug5497Workaround getInstance (Activity activity) {
        if(mInstance==null)
        {
            synchronized (AndroidBug5497Workaround.class)
            {
                mInstance = new AndroidBug5497Workaround(activity);
            }
        }
        return mInstance;
    }

    private AndroidBug5497Workaround(Activity activity) {
        FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
        mChildOfContent = content.getChildAt(0);
        frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();

        _globalListener = new ViewTreeObserver.OnGlobalLayoutListener()
        {

            @Override
            public void onGlobalLayout()
            {
                 possiblyResizeChildOfContent();
            }
        };
    }

    public void setListener()
    {
         mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(_globalListener);
    }

    public void removeListener()
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            mChildOfContent.getViewTreeObserver().removeOnGlobalLayoutListener(_globalListener);
        } else {
            mChildOfContent.getViewTreeObserver().removeGlobalOnLayoutListener(_globalListener);
        }
    }

    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 - r.top);
    } 
}

আমার সম্পাদনাগুলি যেখানে অবস্থিত সেখানে বর্গ ব্যবহার করে

@Override
public void onStart()
{
    super.onStart();
    AndroidBug5497Workaround.getInstance(getActivity()).setListener();
}

@Override
public void onStop()
{
    super.onStop();
    AndroidBug5497Workaround.getInstance(getActivity()).removeListener();
}

7

android:fitsSystemWindows="true"লেআউটে যোগ করুন এবং এই বিন্যাসটি আকার পরিবর্তন করবে।


এটাই আমার জন্য সমাধান করেছে। অতিরিক্ত চিন্তাভাবনা করেও, আপনি এটি সঠিক দৃষ্টিতে সেট করেছেন তা নিশ্চিত করুন। আপনার যদি এমন পটভূমি থাকে যা স্থিতি দণ্ডের নিচে যেতে হবে, এটি সেখানে সেট করবেন না, তবে অভ্যন্তরের বিন্যাসে রাখুন। সম্ভবত এডিটেক্সট ভিউ ইত্যাদি second দ্বিতীয় লেআউটের ভিতরে থাকা উচিত। এছাড়াও এই আলোচনাটি দেখুন, এটি বিষয়গুলিকে আরও স্পষ্ট করে তোলে: youtube.com/watch?v=_mGDMVRO3iE
স্টান

আমার জন্যও কাজ করেছেন। @ স্ট্যান মন্তব্যে ধন্যবাদ আমিও এটিকে পুরোপুরি স্ক্রিন থিমটি কার্যকলাপ / খণ্ড বিন্যাসের পরিবর্তে ভিউপ্যাজারে এই বৈশিষ্ট্যটি স্থাপন করে কাজ করতে সক্ষম করেছিলাম।
marcouberti

5

এটি পূর্ণ স্ক্রিনের সাথে কাজ করার জন্য:

আয়নিক কীবোর্ড প্লাগইন ব্যবহার করুন। এটি আপনাকে কীবোর্ড প্রদর্শিত হবে এবং অদৃশ্য হয়ে যাওয়ার জন্য শুনতে দেয় allows

অনডভাইসরেডি এই ইভেন্ট শ্রোতাদের যুক্ত করুন:

// Allow Screen to Move Up when Keyboard is Present
window.addEventListener('native.keyboardshow', onKeyboardShow);
// Reset Screen after Keyboard hides
window.addEventListener('native.keyboardhide', onKeyboardHide);

যুক্তিটা:

function onKeyboardShow(e) {
    // Get Focused Element
    var thisElement = $(':focus');
    // Get input size
    var i = thisElement.height();
    // Get Window Height
    var h = $(window).height()
    // Get Keyboard Height
    var kH = e.keyboardHeight
    // Get Focused Element Top Offset
    var eH = thisElement.offset().top;
    // Top of Input should still be visible (30 = Fixed Header)
    var vS = h - kH;
    i = i > vS ? (vS - 30) : i;
    // Get Difference
    var diff = (vS - eH - i);
    if (diff < 0) {
        var parent = $('.myOuter-xs.myOuter-md');
        // Add Padding
        var marginTop = parseInt(parent.css('marginTop')) + diff - 25;
        parent.css('marginTop', marginTop + 'px');
    }
}

function onKeyboardHide(e) {
  // Remove All Style Attributes from Parent Div
  $('.myOuter-xs.myOuter-md').removeAttr('style');
}

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

যুক্তিতে সময়সীমা যুক্ত করে বলুন 300 মিমিগুলিরও পারফরম্যান্সকে অনুকূল করা উচিত (কারণ এটি কীবোর্ডের সময়টি প্রদর্শিত হতে পারে)।


3

আমি জোসেফ জনসনের ক্লাস চেষ্টা করেছিলাম, এবং এটি কাজ করে, তবে আমার প্রয়োজনগুলি পুরোপুরি পূরণ করে নি। অ্যান্ড্রয়েড অনুকরণের পরিবর্তে: উইন্ডোসফট ইনপুটমোড = "অ্যাডজাস্টারাইজাইজ", আমার অ্যান্ড্রয়েড অনুকরণ করা দরকার: উইন্ডোসফট ইনপুটমড = "অ্যাডজাস্টপ্যান"।

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

package some.package.name;

import some.package.name.JavaScriptObject;

import android.app.Activity;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;

//-------------------------------------------------------
// ActivityPanner Class
//
// Convenience class to handle Activity attributes bug.
// Use this class instead of windowSoftInputMode="adjustPan".
//
// To implement, call enable() and pass a reference
// to an Activity which already has its content view set.
// Example:
//      setContentView( R.layout.someview );
//      ActivityPanner.enable( this );
//-------------------------------------------------------
//
// Notes:
//
// The standard method for handling screen panning
// when the virtual keyboard appears is to set an activity
// attribute in the manifest.
// Example:
// <activity
//      ...
//      android:windowSoftInputMode="adjustPan"
//      ... >
// Unfortunately, this is ignored when using the fullscreen attribute:
//      android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
//
//-------------------------------------------------------
public class ActivityPanner {

    private View contentView_;
    private int priorVisibleHeight_;

    public static void enable( Activity activity ) {
        new ActivityPanner( activity );
    }

    private ActivityPanner( Activity activity ) {
        FrameLayout content = (FrameLayout)
            activity.findViewById( android.R.id.content );
        contentView_ = content.getChildAt( 0 );
        contentView_.getViewTreeObserver().addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener() {
                public void onGlobalLayout() { panAsNeeded(); }
        });
    }

    private void panAsNeeded() {

        // Get current visible height
        int currentVisibleHeight = visibleHeight();

        // Determine if visible height changed
        if( currentVisibleHeight != priorVisibleHeight_ ) {

            // Determine if keyboard visiblity changed
            int screenHeight =
                contentView_.getRootView().getHeight();
            int coveredHeight =
                screenHeight - currentVisibleHeight;
            if( coveredHeight > (screenHeight/4) ) {
                // Keyboard probably just became visible

                // Get the current focus elements top & bottom
                // using a ratio to convert the values
                // to the native scale.
                float ratio = (float) screenHeight / viewPortHeight();
                int elTop = focusElementTop( ratio );
                int elBottom = focusElementBottom( ratio );

                // Determine the amount of the focus element covered
                // by the keyboard
                int elPixelsCovered = elBottom - currentVisibleHeight;

                // If any amount is covered
                if( elPixelsCovered > 0 ) {

                    // Pan by the amount of coverage
                    int panUpPixels = elPixelsCovered;

                    // Prevent panning so much the top of the element
                    // becomes hidden
                    panUpPixels = ( panUpPixels > elTop ?
                                    elTop : panUpPixels );

                    // Prevent panning more than the keyboard height
                    // (which produces an empty gap in the screen)
                    panUpPixels = ( panUpPixels > coveredHeight ?
                                    coveredHeight : panUpPixels );

                    // Pan up
                    contentView_.setY( -panUpPixels );
                }
            }
            else {
                // Keyboard probably just became hidden

                // Reset pan
                contentView_.setY( 0 );
            }

            // Save usabale height for the next comparison
            priorVisibleHeight_ = currentVisibleHeight;
        }
    }

    private int visibleHeight() {
        Rect r = new Rect();
        contentView_.getWindowVisibleDisplayFrame( r );
        return r.bottom - r.top;
    }

    // Customize this as needed...
    private int viewPortHeight() { return JavaScriptObject.viewPortHeight(); }
    private int focusElementTop( final float ratio ) {
        return (int) (ratio * JavaScriptObject.focusElementTop());
    }
    private int focusElementBottom( final float ratio ) {
        return (int) (ratio * JavaScriptObject.focusElementBottom());
    }

}

আমার যা প্রয়োজন তা মনে হচ্ছে, আপনি কি দয়া করে একটি সম্পূর্ণ নমুনা যুক্ত করতে পারেন? আপনার কাজের জন্য ধন্যবাদ!
ভিলিকভেনে

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

2

প্রকৃতপক্ষে নরম কীবোর্ডের উপস্থিতি কোনওভাবেই প্রভাব ফেলবে বলে মনে হচ্ছে না আমি মোডে Activityযা windowSoftInputModeনির্বাচন করি তা নয় FullScreen

যদিও এই সম্পত্তিটিতে আমি খুব বেশি ডকুমেন্টেশন সন্ধান করতে পারি নি, আমি মনে করি FullScreenমোডটি গেমিং অ্যাপ্লিকেশনের জন্য তৈরি করা হয়েছিল যার জন্য নরম কীবোর্ডের বেশি ব্যবহারের প্রয়োজন হয় না। আপনার যদি এমন কোনও ক্রিয়াকলাপ হয় যা সফ্ট কীবোর্ডের মাধ্যমে ব্যবহারকারীর ইন্টারঅ্যাকশন প্রয়োজন, দয়া করে একটি পূর্ণ-স্ক্রিন-থিম ব্যবহার করে পুনর্বিবেচনা করুন। আপনি কোনও NoTitleBarথিম ব্যবহার করে শিরোনামবারটি বন্ধ করতে পারেন । আপনি কেন বিজ্ঞপ্তি বারটি গোপন করতে চান?


2

শুধু হিসাবে রাখা android:windowSoftInputMode="adjustResize"। কারণ এটি কেবল একটির বাইরে রাখার জন্য দেওয়া হয় "adjustResize"এবং "adjustPan"(উইন্ডো সমন্বয় মোডটি হয় অ্যাড্রেসাইজ করুন বা অ্যাডজাস্টপ্যানের সাহায্যে নির্দিষ্ট করা আছে It আপনি সর্বদা একটি বা অন্য নির্দিষ্ট করে দেওয়ার জন্য এটি সুপারিশ করা হয়)। আপনি এটি এখানে খুঁজে পেতে পারেন: http://developer.android.com/resources/articles/on-screen-inputs.html

এটি আমার পক্ষে পুরোপুরি কাজ করে।


আমার কোনও সমস্যা হচ্ছে না ... আমি আপনার এক্সএমএলও চেষ্টা করেছি। এইটি ওস সংস্করণ ২.২ ব্যবহার করেও কাজ করে ... মি
বালাজি খাদাকে

আমি কেবল পূর্ণ পর্দা মোড দিয়ে চেষ্টা করেছি ... আমি এটি আমার নেক্সাস ওয়ান এবং নেক্সাস এস এ পরীক্ষা করছি .... এটি কাজ করে।
বালাজি খড়কে

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


1

শুধুমাত্র ব্যবহার android:windowSoftInputMode="adjustResize|stateHiddenহিসাবে আপনি AdjustPan ব্যবহার তারপর এটি পুনরায় আকার দেওয়া সম্পত্তি অক্ষম


আমি এটিও ব্যবহার করেছি .... দয়া করে আপনি এটি পুরো স্ক্রিন মোডে করছেন এবং আপনি কোন ডিভাইসে পরীক্ষা করছেন?
বিনীত শুক্লা

এইচটিসি নেক্সাস এক, ঠিক আছে আমি পুরো স্ক্রিন যুক্ত করতে চাই
মোহাম্মদ আজহারউদ্দিন শাইখ

আপনি getWindow () ব্যবহার করতে পারেন। অনুরোধের বৈশিষ্ট্য (উইন্ডো। FEATURE_NO_TITLE); onCreate () পরিবর্তে থিম ব্যবহার করছেন?
মোহাম্মদ আজহারউদ্দিন শাইখ

10
উপরের কোডটি পুরো স্ক্রিন ছাড়াই দুর্দান্ত কাজ করছে তবে এক্সএমএল বা কোড থেকে পূর্ণ স্ক্রিন যুক্ত করছে ... এটি কাজ করছে না ... দয়া করে প্রশ্নটি মনোযোগ সহকারে পড়ুন।
বিনীত শুক্লা

1

আমি জোসেফ জনসন অ্যান্ড্রয়েডবাগ 5497 ওয়ার্কআউন্ড ক্লাস তৈরি করেছি তবে সফটকিবোর্ড এবং ভিউয়ের মধ্যে কালো জায়গা পেয়েছি। আমি এই লিঙ্কটি গ্রেগ এনিসকে উল্লেখ করেছি । উপরের কিছু পরিবর্তন করার পরে এটি আমার চূড়ান্ত কার্য কোড।

 public class SignUpActivity extends Activity {

 private RelativeLayout rlRootView; // this is my root layout
 private View rootView;
 private ViewGroup contentContainer;
 private ViewTreeObserver viewTreeObserver;
 private ViewTreeObserver.OnGlobalLayoutListener listener;
 private Rect contentAreaOfWindowBounds = new Rect();
 private FrameLayout.LayoutParams rootViewLayout;
 private int usableHeightPrevious = 0;

 private View mDecorView;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_sign_up);
  mDecorView = getWindow().getDecorView();
  contentContainer =
   (ViewGroup) this.findViewById(android.R.id.content);

  listener = new OnGlobalLayoutListener() {
   @Override
   public void onGlobalLayout() {
    possiblyResizeChildOfContent();
   }
  };

  rootView = contentContainer.getChildAt(0);
  rootViewLayout = (FrameLayout.LayoutParams)
  rootView.getLayoutParams();

  rlRootView = (RelativeLayout) findViewById(R.id.rlRootView);


  rlRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
   @Override
   public void onGlobalLayout() {
    int heightDiff = rlRootView.getRootView().getHeight() - rlRootView.getHeight();
    if (heightDiff > Util.dpToPx(SignUpActivity.this, 200)) {
     // if more than 200 dp, it's probably a keyboard...
     //  Logger.info("Soft Key Board ", "Key board is open");

    } else {
     Logger.info("Soft Key Board ", "Key board is CLOSED");

     hideSystemUI();
    }
   }
  });
 }

 // This snippet hides the system bars.
 protected void hideSystemUI() {
  // Set the IMMERSIVE flag.
  // Set the content to appear under the system bars so that the 
  content
  // doesn't resize when the system bars hide and show.
  mDecorView.setSystemUiVisibility(
   View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
 }
 @Override
 protected void onPause() {
  super.onPause();
  if (viewTreeObserver.isAlive()) {
   viewTreeObserver.removeOnGlobalLayoutListener(listener);
  }
 }

 @Override
 protected void onResume() {
  super.onResume();
  if (viewTreeObserver == null || !viewTreeObserver.isAlive()) {
   viewTreeObserver = rootView.getViewTreeObserver();
  }
  viewTreeObserver.addOnGlobalLayoutListener(listener);
 }

 @Override
 protected void onDestroy() {
  super.onDestroy();
  rootView = null;
  contentContainer = null;
  viewTreeObserver = null;
 }
 private void possiblyResizeChildOfContent() {
  contentContainer.getWindowVisibleDisplayFrame(contentAreaOfWindowBounds);

  int usableHeightNow = contentAreaOfWindowBounds.height();

  if (usableHeightNow != usableHeightPrevious) {
   rootViewLayout.height = usableHeightNow;
   rootView.layout(contentAreaOfWindowBounds.left,
    contentAreaOfWindowBounds.top, contentAreaOfWindowBounds.right, contentAreaOfWindowBounds.bottom);
   rootView.requestLayout();

   usableHeightPrevious = usableHeightNow;
  } else {

   this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
  }
 }
}

1

আমি বর্তমানে এই পদ্ধতির ব্যবহার করছি এবং এটি একটি কবজির মতো কাজ করে। কৌশলটি হ'ল আমরা কীবোর্ডের উচ্চতা পাই উপরের এবং নীচে 21-র উপরে বিভিন্ন পদ্ধতি থেকে এবং তারপরে এটি আমাদের ক্রিয়াকলাপে আমাদের মূল দৃশ্যের নীচের প্যাডিং হিসাবে ব্যবহার করি। আমি ধরে নিয়েছি আপনার বিন্যাসে শীর্ষ প্যাডিং দরকার নেই (স্ট্যাটাস বারের নীচে যায়) তবে আপনি যদি করেন তবে আমার উত্তর আপডেট করতে আমাকে জানান।

MainActivity.java

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RelativeLayout mainLayout = findViewById(R.id.main_layout);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            ViewCompat.setOnApplyWindowInsetsListener(mainLayout , new OnApplyWindowInsetsListener() {
                @Override
                public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
                    v.setPadding(0, 0, 0, insets.getSystemWindowInsetBottom());
                    return insets;
                }
            });
        } else {
            View decorView = getWindow().getDecorView();
            final View contentView = mainLayout;
            decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    Rect r = new Rect();
                    //r will be populated with the coordinates of your view that area still visible.
                    decorView.getWindowVisibleDisplayFrame(r);

                    //get screen height and calculate the difference with the useable area from the r
                    int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels;
                    int diff = height - r.bottom;

                    //if it could be a keyboard add the padding to the view
                    if (diff != 0) {
                        // if the use-able screen height differs from the total screen height we assume that it shows a keyboard now
                        //check if the padding is 0 (if yes set the padding for the keyboard)
                        if (contentView.getPaddingBottom() != diff) {
                            //set the padding of the contentView for the keyboard
                            contentView.setPadding(0, 0, 0, diff);
                        }
                    } else {
                        //check if the padding is != 0 (if yes reset the padding)
                        if (contentView.getPaddingBottom() != 0) {
                            //reset the padding of the contentView
                            contentView.setPadding(0, 0, 0, 0);
                        }
                    }
                }
            });
        }
    }
...
}

কোনও আইডি দিয়ে আপনার মূল দর্শনটি সম্বোধন করতে ভুলবেন না:

activity_main.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

আশা করি এটি কাউকে সাহায্য করবে।


1

https://stackoverflow.com/a/19494006/1815624 এর উপর ভিত্তি করে এবং এটি ঘটানোর ইচ্ছা ...

আপডেট ধারণা


থেকে উত্তর একত্রিত

প্রাসঙ্গিক কোড:

        if (heightDifference > (usableHeightSansKeyboard / 4)) {

            // keyboard probably just became visible
            frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
        } else {

            // keyboard probably just became hidden
            if(usableHeightPrevious != 0) {
                frameLayoutParams.height = usableHeightSansKeyboard;
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
                activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

            }

Https://github.com/CrandellWS/AndroidBug5497Workaround/blob/master/AndroidBug5497Workaround.java এ সম্পূর্ণ উত্স

পুরানো ধারণা

কীবোর্ড খোলার আগে ধারকগুলির উচ্চতার একটি স্থিতিশীল মান তৈরি করুন কীবোর্ডটি খোলার উপর ভিত্তি করে ধারক উচ্চতা সেট করুন usableHeightSansKeyboard - heightDifferenceএবং এটি বন্ধ হয়ে গেলে সেভ করা মানটিতে ফিরে সেট করুন

if (heightDifference > (usableHeightSansKeyboard / 4)) {
                // keyboard probably just became visible
                frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
                int mStatusHeight = getStatusBarHeight();
                frameLayoutParams.topMargin = mStatusHeight;
                ((MainActivity)activity).setMyMainHeight(usableHeightSansKeyboard - heightDifference);

                if(BuildConfig.DEBUG){
                    Log.v("aBug5497", "keyboard probably just became visible");
                }
            } else {
                // keyboard probably just became hidden
                if(usableHeightPrevious != 0) {
                    frameLayoutParams.height = usableHeightSansKeyboard;
                    ((MainActivity)activity).setMyMainHeight();    
                }
                frameLayoutParams.topMargin = 0;

                if(BuildConfig.DEBUG){
                    Log.v("aBug5497", "keyboard probably just became hidden");
                }
            }

মেইনএ্যাকটিভিটির পদ্ধতি

public void setMyMainHeight(final int myMainHeight) {

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            ConstraintLayout.LayoutParams rLparams =  (ConstraintLayout.LayoutParams) myContainer.getLayoutParams();
            rLparams.height = myMainHeight;

            myContainer.setLayoutParams(rLparams);
        }

    });

}

int mainHeight = 0;
public void setMyMainHeight() {

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            ConstraintLayout.LayoutParams rLparams =  (ConstraintLayout.LayoutParams) myContainer.getLayoutParams();
            rLparams.height = mainHeight;

            myContainer.setLayoutParams(rLparams);
        }

    });

}

উদাহরণস্বরূপ ধারক এক্সএমএল

<android.support.constraint.ConstraintLayout
    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.support.constraint.ConstraintLayout
            android:id="@+id/my_container"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintHeight_percent=".8">

একইভাবে প্রয়োজনে মার্জিন যুক্ত করা যেতে পারে ...

আরেকটি বিবেচনা হ'ল ব্যবহারের প্যাডিং এর একটি উদাহরণ পাওয়া যাবে:

https://github.com/mikepenz/MaterialDrawer/issues/95#issuecomment-80519589


1

1) কীবোর্ডহাইট হেল্পার তৈরি করুন:

public class KeyboardHeightHelper {

    private final View decorView;
    private int lastKeyboardHeight = -1;

    public KeyboardHeightHelper(Activity activity, View activityRootView, OnKeyboardHeightChangeListener listener) {
        this.decorView = activity.getWindow().getDecorView();
        activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
            int keyboardHeight = getKeyboardHeight();
            if (lastKeyboardHeight != keyboardHeight) {
                lastKeyboardHeight = keyboardHeight;
                listener.onKeyboardHeightChange(keyboardHeight);
            }
        });
    }

    private int getKeyboardHeight() {
        Rect rect = new Rect();
        decorView.getWindowVisibleDisplayFrame(rect);
        return decorView.getHeight() - rect.bottom;
    }

    public interface OnKeyboardHeightChangeListener {
        void onKeyboardHeightChange(int keyboardHeight);
    }
}

2) আপনার ক্রিয়াকলাপটি পূর্ণ স্ক্রিন হতে দিন:

activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

3) কীবোর্ডের উচ্চতা পরিবর্তনের জন্য শুনুন এবং আপনার দর্শনটির জন্য নীচে প্যাডিং যুক্ত করুন:

View rootView = activity.findViewById(R.id.root); // your root view or any other you want to resize
KeyboardHeightHelper effectiveHeightHelper = new KeyboardHeightHelper(
        activity, 
        rootView,
        keyboardHeight -> rootView.setPadding(0, 0, 0, keyboardHeight));

সুতরাং , প্রতিটি সময় কীবোর্ড স্ক্রিনে উপস্থিত হবে - আপনার দেখার জন্য নীচের প্যাডিং পরিবর্তন হবে এবং সামগ্রী পুনরায় সাজানো হবে।


0

আপনি নীচের দণ্ডটি দৃশ্যের নীচে আটকে রাখতে চান, তবে কীবোর্ড প্রদর্শিত হলে কি-বোর্ডের উপরে রাখার জন্য তাদের উপরে উঠানো উচিত, তাই না?

আপনি এই কোড স্নিপেট চেষ্টা করতে পারেন:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    ...>

    <RelativeLayout
        android:id="@+id/RelativeLayoutTopBar"
    ...>
    </RelativeLayout>

    <LinearLayout
        android:id="@+id/LinearLayoutBottomBar"
        android:layout_alignParentBottom = true
        ...>
    </LinearLayout>

    <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="390dp"
    android:orientation="vertical" 
    android:layout_above="@+id/LinearLayoutBottomBar"
    android:layout_below="@+id/RelativeLayoutTopBar"> 

    <ScrollView 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:id="@+id/ScrollViewBackground">

            ...

        </ScrollView>
     </LinearLayout>
  </RelativeLayout>

বটমবারটি ভিউয়ের নীচে আটকে থাকবে এবং উপরের / নীচের দণ্ড এবং কীবোর্ডটি প্রদর্শিত হওয়ার পরে স্ক্রোলভিউযুক্ত লিনিয়ারলাউটটি ভিউয়ের বাকী যা নেবে তা নিয়ে যাবে। এটি আপনার পক্ষে কাজ করে কিনা তা আমাকে জানান।


1
এটি আমার অ্যাপ্লিকেশানগুলিতে বেশ কয়েকবার কাজ করার কারণে খুব আশ্চর্যজনক। যাইহোক, রিলেটিভলআউটের কোনও ওরিয়েন্টেশন নেই সুতরাং আপনি এই কোডগুলিতে আপনার কোডগুলিতে মুছতে পারেন। আমি কেবল স্বীকৃত হয়েছি যে আমি কোড স্নিপেটটি লাইনটিতে কেটে দিতে পারতাম: অ্যান্ড্রয়েড: লেআউট_বেলো = "@ + আইডি / স্কোরিংকন্টিনিয়ার ভিউ" যা আপনাকে আপনার স্ক্রোলভিউতে যোগ করতে হবে
ব্যানজাই 86

পূর্ণ পর্দা? আপনি কি শীর্ষে বিন্যাস ছাড়াই বোঝাতে চান?
banzai86

না ..... আমার মানে এমন কোনও স্ট্যাটাস বার নেই যা ব্যাটারি লাইফ, ডিভাইসের জন্য সংযোগ ইত্যাদি দেখায় ....
ভিনিত শুক্ল

না, আমার অ্যাপ্লিকেশনটিতে স্ট্যাটাসবারটি দৃশ্যমান। আপনি কি আপনার লেআউটের ক্রম পরিবর্তন করার চেষ্টা করতে পারবেন, এর অর্থ আপনি নিজের বিন্যাসের কোডটি অন্য কোডের ওপরে বোতামগুলির সাথে রেখেছেন এবং তারপরে আবার চেষ্টা করবেন? লেআউট_বিলোটি ব্যবহার করতে আপনাকে প্রথমে তাদের সংজ্ঞায়িত করতে হবে
banzai86

1
দয়া করে প্রশ্নটি মনোযোগ সহকারে পড়ুন ...... আমি উল্লেখ করেছি যে আমি ফুলস্ক্রিন মোডে সমস্যায় পড়ছি ......
ভিনিত শুক্ল

0

আপনার উত্তরের জন্য জোসেফকে ধন্যবাদ জানাই। যাইহোক, পদ্ধতিতে সম্ভবত রিসাইজচিল্ডফ্যান্ট (), অংশ

else {
            // keyboard probably just became hidden
            frameLayoutParams.height = usableHeightSansKeyboard;
        }

আমার নীচের অংশটি লুকানো হয়ে যাওয়ার কারণে আমার পক্ষে কাজ করা হয়নি। সুতরাং আমাকে একটি বৈশ্বিক পরিবর্তনশীল পুনরুদ্ধার হাইট নিতে হয়েছিল, এবং কনস্ট্রাক্টরে আমি শেষ লাইনটি .োকালাম

restoreHeight = frameLayoutParams.height;

এবং তারপরে আমি পূর্বের উল্লিখিত অংশটি প্রতিস্থাপন করেছি

else {
            // keyboard probably just became hidden
            frameLayoutParams.height = restoreHeight;
        }

তবে আপনার কোডটি আমার পক্ষে কেন কাজ করে না তা আমার কোনও ধারণা নেই। কেউ যদি এ বিষয়ে আলোকপাত করতে পারে তবে এটি খুব সহায়ক হবে।


0

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

পূর্ণ স্ক্রীন ব্যবহার করার পরিবর্তে, অ্যান্ড্রয়েডের জন্য আমার কনফিগারটি সম্পূর্ণ-স্ক্রিনহীন করার জন্য আমি সংশোধন করেছি:

            <preference name="fullscreen" value="false" />

এবং cordova-plugin-statusbarকমান্ড লাইনের মাধ্যমে, যুক্ত করেছে :

cordova plugin add cordova-plugin-statusbar

অ্যাপ্লিকেশনটি লোড হয়ে গেলে, আমি নিজেকে লুকানোর জন্য প্লাগইনটিতে একটি পদ্ধতি কল করি, যেমন:

    if (window.cordova && window.cordova.platformId == 'android' && window.StatusBar)
        window.StatusBar.hide();

এটি একটি কবজির মতো কাজ করে। কেবল আসল ক্ষতি হ'ল অ্যাপটি লোড হওয়ার পরে স্থিতি দণ্ডটি দ্বিগুণভাবে দৃশ্যমান। আমার প্রয়োজনের জন্য, এটি কোনও সমস্যা ছিল না।


0

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


0

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

কীবোর্ড যখন প্রদর্শিত হচ্ছে তখন সামগ্রীর শীর্ষে মার্জিন যুক্ত করার উপর ভিত্তি করে আমার ধারণা।

contentContainer.getWindowVisibleDisplayFrame(contentAreaOfWindowBounds);
    int usableHeightNow = contentAreaOfWindowBounds.height();

    if (usableHeightNow != usableHeightPrevious) {

        int difference = usableHeightNow - usableHeightPrevious;

        if (difference < 0 && difference < -150) {
            keyboardShowed = true;
            rootViewLayout.topMargin -= difference + 30;
            rootViewLayout.bottomMargin += 30;
        }
        else if (difference < 0 && difference > -150){
            rootViewLayout.topMargin -= difference + 30;
        }
        else if (difference > 0 && difference > 150) {
            keyboardShowed = false;
            rootViewLayout.topMargin = 0;
            rootViewLayout.bottomMargin = 0;
        }

        rootView.requestLayout();

        Log.e("Bug Workaround", "Difference: " + difference);

        usableHeightPrevious = usableHeightNow;
}

আপনি দেখতে পাচ্ছেন, আমি পার্থক্যটিতে 30 পিক্স যুক্ত করেছি কারণ স্ক্রিনের শীর্ষে এবং মার্জিন সহ সামগ্রী সামগ্রীের মাঝে একটি ছোট সাদা জায়গা রয়েছে। এবং আমি জানি না কোথা থেকে এটি প্রদর্শিত হবে তাই আমি ঠিক করলাম ঠিক মার্জিন আরও ছোট করব এবং এখন এটি আমার কীভাবে প্রয়োজন ঠিক ঠিক কাজ করে।


0

আজ পুরো স্ক্রিন ইস্যুতে অ্যাডজাস্টের কাজ না করা অ্যান্ড্রয়েড এসডিকে বাস্তব।

উত্তরগুলি থেকে আমি খুঁজে পেয়েছি:
সমাধান - তবে সমাধানটি চিত্রের ইস্যুতে দেখায়:

আমি সমাধানটি খুঁজে পেয়েছি এবং একটি অপ্রয়োজনীয় ক্রিয়া সরিয়ে দেওয়ার চেয়ে :

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

সুতরাং, কোটলিনে আমার স্থির সমাধান কোডটি দেখুন:

class AndroidBug5497Workaround constructor(val activity: Activity) {

    private val content = activity.findViewById<View>(android.R.id.content) as FrameLayout

    private val mChildOfContent = content.getChildAt(0)
    private var usableHeightPrevious: Int = 0
    private val contentContainer = activity.findViewById(android.R.id.content) as ViewGroup
    private val rootView = contentContainer.getChildAt(0)
    private val rootViewLayout = rootView.layoutParams as FrameLayout.LayoutParams

    private val listener = {
        possiblyResizeChildOfContent()
    }

    fun addListener() {
        mChildOfContent.apply {
            viewTreeObserver.addOnGlobalLayoutListener(listener)

        }
    }

    fun removeListener() {
        mChildOfContent.apply {
            viewTreeObserver.removeOnGlobalLayoutListener(listener)
        }
    }

    private fun possiblyResizeChildOfContent() {
        val contentAreaOfWindowBounds = Rect()
        mChildOfContent.getWindowVisibleDisplayFrame(contentAreaOfWindowBounds)
        val usableHeightNow = contentAreaOfWindowBounds.height()

        if (usableHeightNow != usableHeightPrevious) {
            rootViewLayout.height = usableHeightNow
            rootView.layout(contentAreaOfWindowBounds.left,
                    contentAreaOfWindowBounds.top, contentAreaOfWindowBounds.right, contentAreaOfWindowBounds.bottom);
            mChildOfContent.requestLayout()
            usableHeightPrevious = usableHeightNow
        }
    }
}

আমার বাগ ফিক্সিং কোড প্রয়োগ করে:

 class LeaveDetailActivity : BaseActivity(){

    private val keyBoardBugWorkaround by lazy {
        AndroidBug5497Workaround(this)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

    }

    override fun onResume() {
        keyBoardBugWorkaround.addListener()
        super.onResume()
    }

    override fun onPause() {
        keyBoardBugWorkaround.removeListener()
        super.onPause()
    }
}

0

ব্যবহার করবেন না:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

খারাপ কাজ কারণ। পরিবর্তে, ব্যবহার করুন:

fun setFullScreen(fullScreen: Boolean) {
        val decorView = getWindow().getDecorView()
        val uiOptions : Int
        if(fullScreen){
            uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN // this hide statusBar
            toolbar.visibility = View.GONE // if you use toolbar
            tabs.visibility = View.GONE // if you use tabLayout
        } else {
            uiOptions = View.SYSTEM_UI_FLAG_VISIBLE // this show statusBar
            toolbar.visibility = View.VISIBLE
            tabs.visibility = View.VISIBLE
        }
        decorView.setSystemUiVisibility(uiOptions)
    }

-1

আমার ক্ষেত্রে, ক্রসওয়াকটি আমার কর্ডোভা অ্যাপ্লিকেশনটিতে যুক্ত করার পরে এই সমস্যাটি ঘটতে শুরু করে। আমার অ্যাপ্লিকেশনটি ফুলস্ক্রিন এবং অ্যান্ড্রয়েডে ব্যবহৃত হয় না: উইন্ডোসফট ইনপুটমড = "অ্যাডজাস্টপ্যান"।

আমার কাছে ইতিমধ্যে অ্যাপ্লিকেশনটিতে আয়নিক কীবোর্ড প্লাগইন ছিল, সুতরাং কীবোর্ডটি উপরে বা নীচে ছিল কিনা তা সনাক্তকরণ এটির জন্য সহজ ধন্যবাদ ছিল:

// Listen for events to when the keyboard is opened and closed
window.addEventListener("native.keyboardshow", keyboardUp, false);
window.addEventListener('native.keyboardhide', keyboardDown, false);

function keyboardUp()
{
    $('html').addClass('keyboardUp');
}

function keyboardDown()
{
    $('html').removeClass('keyboardUp');
}

আমি উপরের সমস্ত ফিক্সগুলির চেষ্টা করেছিলাম তবে সহজ লাইনটি আমার জন্য এটি শেষ করে দেয় তা হ'ল CSS এর এই বিট:

&.keyboardUp {
        overflow-y: scroll;
}

আশা করি এটি আমি যে কয়েকটা দিন ব্যয় করেছি তা এটি রক্ষা করে। :)


আমি কর্ডোভা সহ অ্যান্ড্রয়েডের সাথে ক্রসওয়াক ব্যবহার করছি: উইন্ডোসফট ইনপুটমড = "অ্যাডজাস্টপ্যান"। তবে এটি কাজ করছে না। আমি দেখতে পাচ্ছি যে ক্লাসটি এইচটিএমএল উপাদানটিতে যুক্ত হচ্ছে, তবে CSS এর স্ক্রিনে কোনও প্রভাব নেই। আপনার কাছে এমন আরও কিছু সেটিং রয়েছে যা স্ক্রিনটি সরানোর অনুমতি দেয়?
21

এটির কাজ করার জন্য আমাকে অ্যাড ট্রান্সফর্ম: ট্রান্সলেটওয়াই (0 পিক্সেল) সেট করতে হবে। তবে স্ক্রোলিং মোটেই কাজ করে না। কোন ধারনা?
সাহস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.