एंड्रॉइड में एक गतिविधि में सॉफ्ट कीबोर्ड खुला और बंद श्रोता


136

मेरे पास एक Activityजगह है जहां 5 EditTextएस हैं। जब उपयोगकर्ता पहले पर क्लिक करता है EditText, तो उसमें कुछ मूल्य दर्ज करने के लिए सॉफ्ट कीबोर्ड खुलता है। सॉफ्ट कीबोर्ड खुलने पर मैं कुछ अन्य Viewदृश्यता सेट करना चाहता हूं Goneऔर यह भी कि जब उपयोगकर्ता पहले पर क्लिक करता है EditTextऔर जब सॉफ्ट कीबोर्ड EditTextबैक बटन प्रेस पर उसी से बंद होता है । तब मैं कुछ अन्य Viewदृश्यता को दृश्यमान पर सेट करना चाहता हूं ।

EditTextएंड्रॉइड में पहली बार एक क्लिक से सॉफ्ट कीबोर्ड खुलने पर क्या कोई श्रोता या कॉलबैक या कोई हैक होता है?


1
नहीं, ऐसे श्रोता नहीं हैं। वहाँ रहे हैं प्राप्त करने के लिए आप क्या करने की कोशिश कर रहे हैं हैक्स। यहां एक संभावित दृष्टिकोण है: एंड्रॉइड में पॉइंटर इवेंट को कैसे भेजें
विक्रम

@ विक्रम मैं नहीं देख रहा हूँtrying to detect the virtual keyboard height in Android.
N शर्मा

मुझे पता है। यदि आप कोड के माध्यम से जाते हैं, तो आप देखेंगे कि ऊंचाई कैसे निर्धारित की जा रही है। एक पॉइंटर घटना भेजी जा रही है -> दो मामले => 1. यदि कीबोर्ड खुला है => और यदि पॉइंटर का Xऔर Yस्थान कीबोर्ड के ऊपर / पर गिरता है => SecurityException=> कमी हो जाती है Yऔर फिर से कोशिश करें => जब तक कोई अपवाद न फेंके => वर्तमान Yमान कीबोर्ड ऊंचाई है। 2. यदि कीबोर्ड खुला नहीं है => नहीं SecurityException
विक्रम

यह आपके परिदृश्य पर कैसे लागू होता है? स्क्रीन की ऊंचाई के 2/3 कहने पर एक पॉइंटर ईवेंट भेजें। यदि कोई SecurityExceptionफेंक दिया गया है => कीबोर्ड खुला है। और, कीबोर्ड बंद है।
विक्रम

@ विक्रम मैं केवल यही चाहता हूं कि पहले EditTextदूसरे न हों EditText। मैं इसे कैसे भेद कर सकता हूं?
एन शर्मा

जवाबों:


91

यह केवल तभी काम करता है जब android:windowSoftInputModeआपकी गतिविधि adjustResizeप्रकट में सेट हो । आप यह देखने के लिए एक लेआउट श्रोता का उपयोग कर सकते हैं कि क्या कीबोर्ड द्वारा आपकी गतिविधि का रूट लेआउट बदला गया है।

मैं अपनी गतिविधियों के लिए निम्न आधार वर्ग की तरह कुछ का उपयोग करता हूं:

public class BaseActivity extends Activity {
    private ViewTreeObserver.OnGlobalLayoutListener keyboardLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int heightDiff = rootLayout.getRootView().getHeight() - rootLayout.getHeight();
            int contentViewTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();

            LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(BaseActivity.this);

            if(heightDiff <= contentViewTop){
                onHideKeyboard();

                Intent intent = new Intent("KeyboardWillHide");
                broadcastManager.sendBroadcast(intent);
            } else {
                int keyboardHeight = heightDiff - contentViewTop;
                onShowKeyboard(keyboardHeight);

                Intent intent = new Intent("KeyboardWillShow");
                intent.putExtra("KeyboardHeight", keyboardHeight);
                broadcastManager.sendBroadcast(intent);
            }
        }
    };

    private boolean keyboardListenersAttached = false;
    private ViewGroup rootLayout;

    protected void onShowKeyboard(int keyboardHeight) {}
    protected void onHideKeyboard() {}

    protected void attachKeyboardListeners() {
        if (keyboardListenersAttached) {
            return;
        }

        rootLayout = (ViewGroup) findViewById(R.id.rootLayout);
        rootLayout.getViewTreeObserver().addOnGlobalLayoutListener(keyboardLayoutListener);

        keyboardListenersAttached = true;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (keyboardListenersAttached) {
            rootLayout.getViewTreeObserver().removeGlobalOnLayoutListener(keyboardLayoutListener);
        }
    }
}

निम्न उदाहरण गतिविधि कीबोर्ड को दिखाए जाने पर दृश्य को छिपाने के लिए इसका उपयोग करती है और कीबोर्ड के छिपे होने पर इसे फिर से दिखाती है।

Xml लेआउट:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/rootLayout"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">              

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        >

        <!-- omitted for brevity -->

    </ScrollView>

    <LinearLayout android:id="@+id/bottomContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >

        <!-- omitted for brevity -->

    </LinearLayout>

</LinearLayout>

और गतिविधि:

public class TestActivity extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_activity);

        attachKeyboardListeners();
    }

    @Override
    protected void onShowKeyboard(int keyboardHeight) {
        // do things when keyboard is shown
        bottomContainer.setVisibility(View.GONE);
    }

    @Override
    protected void onHideKeyboard() {
        // do things when keyboard is hidden
        bottomContainer.setVisibility(View.VISIBLE);
    }        
}

4
+1 हाँ यह मेरी समस्या का सही समाधान है।
एन शर्मा

18
नमस्ते, आपने window.ID_ANDROID_CONTENT पर getTop () का उपयोग किया। गेट टॉप मेरे लिए काम नहीं करता है। यह हमेशा यहाँ 0 है, यह काम करता है जैसे कि इसे getHeight () के बजाय उपयोग करना चाहिए।
डेनियल सेगातो

1
आप कहाँ rootLayout = (ViewGroup) findViewById(R.id.rootLayout);से प्राप्त करते हैं
18

1
किसी कारण से मेरे लिए काम नहीं कर रहा है, यह हमेशा onShowKeyboard कहता है या तो मैं इसे खोलता हूं या इसे बंद करता हूं। मैं findViewById (android.R.id.content) का उपयोग कर रहा हूँ, शायद यही समस्या है?
मैकुलसिवन डी'अंडर

2
@tsig आपका +100 समाधान विशिष्ट स्क्रीन पर निर्भर करता है। टेबलेट और एचडीपीआई फोन पर विफल। मैंने डिवाइस की ऊंचाई के दस प्रतिशत के रूप में सुधार का उपयोग किया। इसका मतलब है कि अगर स्क्रीन की ऊंचाई से दृश्य ऊंचाई कम है - 10% कीबोर्ड खुला है। और कीबोर्ड बंद है। यहाँ मेरा कंटेंट व्यू ऑन ऑन है ग्लोडलैट: कंटेंट व्यू टॉप = (getWindow ()। GetDecorView ()। GetBottom () / 10)
ilker

94

भयानक KeyboardVisibilityEvent पुस्तकालय के साथ केक का टुकड़ा

KeyboardVisibilityEvent.setEventListener(
    getActivity(),
    new KeyboardVisibilityEventListener() {
        @Override
        public void onVisibilityChanged(boolean isOpen) {
            // write your code
        }
    });

यासुहिरो SHIMIZU के लिए क्रेडिट


यह काम नहीं करेगा क्योंकि कीबोर्ड में स्थिर ऊंचाइयां नहीं हैं, और इस लाइब्रेरी में ऊंचाई 100dp पर सेट है।
11

@milosmns कीबोर्ड डिटेक्शन के लिए 100dp की थ्रेसहोल्ड ऊंचाई का उपयोग किया जाता है। वास्तविक कीबोर्ड की ऊँचाई के बारे में कोई धारणा नहीं बनाई गई है
नीनो वैन हूफ़

11
यह अभी भी कठिन कोडित है। बहु खिड़की? सैमसंग विभाजित दृश्य? पिक्चर इन पिक्चर मोड? इसके अलावा एक न्यूनतम एक-पंक्ति वाला कीबोर्ड है जो 100dp तक गिर जाएगा। यहां चांदी की गोली नहीं है ...
'10:03 बजे मिल्समॉन

1
क्योंकि इस मुद्दे के लिए कोई पकड़ नहीं है, यह लागू करने के लिए सबसे आसान लगता है और बस उस कोड पर वापस जाएं जिसे आप वास्तव में काम करना चाहते हैं :)
मशीन जनजाति

1
यह अब तक का सबसे अच्छा जवाब है, किसी भी उपकरण पर पूरी तरह से विश्वसनीय है
पेलेन्स

69

जैसा कि विक्रम ने टिप्पणियों में बताया, यह पता लगाने के लिए कि सॉफ्टबोर्ड को दिखाया गया है या गायब हो गया है, केवल कुछ बदसूरत हैक के साथ ही संभव है।

शायद यह एडिटस्टेक्स्ट पर फोकस श्रोता सेट करने के लिए पर्याप्त है :

yourEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            //got focus
        } else {
            //lost focus
        }
   }
});

27
मान लीजिए मैं एडिटेक्स पर क्लिक करता हूं तो यह setOnFocusChangeListenerश्रोता कहलाएगा फिर मैं वापस प्रेस करता हूं फिर यह कीबोर्ड को बंद कर देता है लेकिन अन्य दृश्यों पर क्लिक नहीं करता है, अब फिर से मैं उसी एडिटेक्स पर क्लिक करता हूं जिसमें पहले से ही फोकस है फिर क्या होगा?
एन शर्मा

3
@Williams मैं पूरी तरह से निश्चित नहीं हूं, लेकिन मुझे संदेह है कि onFocusChange()बुलाया नहीं जाएगा।
कॉमनग्यू

1
यह मेरा सवाल नहीं है। कृपया मेरे प्रश्न को फिर से पढ़ें - मेरे पास गतिविधि है जहाँ 5 EditText हैं। जब उपयोगकर्ता पहले EditText पर क्लिक करता है तो उसमें कुछ मूल्य दर्ज करने के लिए सॉफ्ट कीबोर्ड खुला होता है। मैं कुछ अन्य दृश्य दृश्यता सेट करना चाहता हूं जब सॉफ्ट कीबोर्ड खुला होता है जब उपयोगकर्ता पहले एडिट टेक्स्ट पर क्लिक करता है और जब सॉफ्ट कीबोर्ड बैक एडिट पर एक ही एडिट टेक्स्ट से बंद होता है तो मैं कुछ अन्य दृश्य दृश्यता सेट करना चाहता हूं। क्या कोई श्रोता या कॉलबैक या कोई हैक होता है जब एंड्रॉइड में पहले एडिट टेक्स्ट पर क्लिक करने पर सॉफ्ट कीबोर्ड खुलता है?
एन शर्मा

4
दोस्तों इस जवाब को मत देखो क्योंकि वह कुछ अलग बता रहा है यहाँ तक कि मुझे समझ नहीं आ रहा है।
एन शर्मा

2
वैसे भी, यह मेरे लिए काम नहीं करता है ... जब नरम कीबोर्ड छिपा होता है, तो EditText पर कोई फ़ोकस परिवर्तन नहीं हुआ है ... इसलिए मुझे इस श्रोता से सूचित नहीं किया जा सकता है।
लाइसैट जूलियस

50

गतिविधि के लिए:

    final View activityRootView = findViewById(R.id.activityRoot);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Rect r = new Rect();

                activityRootView.getWindowVisibleDisplayFrame(r);

                int heightDiff = view.getRootView().getHeight() - (r.bottom - r.top);
                if (heightDiff > 100) { 
                 //enter your code here
                }else{
                 //enter code for hid
                }
            }
        });

टुकड़े के लिए:

    view = inflater.inflate(R.layout.live_chat_fragment, null);
view.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.
                view.getWindowVisibleDisplayFrame(r);

                int heightDiff = view.getRootView().getHeight() - (r.bottom - r.top);
                if (heightDiff > 500) { // if more than 100 pixels, its probably a keyboard...

                }
            }
        });

3
इसे गतिविधि के लिए उपयोग किया जाता है, लेकिन स्क्रीन आकार की तुलना में दृश्य i के साथ तुलना करने के बजाय। महान काम करता है
Roee

बेहतर होगा कि ऊंचाई की तुलना करें डीपी में ऊंचाई के साथ-साथ पिक्सल में। यह काफी भिन्न हो सकता है।
लियो डायरोडकर

क्या इसे android:windowSoftInputMode="adjustResize"प्रकट होने की आवश्यकता है ?
लियूवेनबिन_NO।

Android: windowSoftInputMode = "समायोजित करें" Android: configChanges = "ओरिएंटेशन | कीबोर्ड |
कीबोर्डहेड

यह मेरे लिए काम करता है, फिर भी, मेरे पास एक सवाल है। क्या यह बहुत सारे खर्च हैं?
लाइसैट जूलियस

32

जाप का जवाब AppCompatActivity के लिए काम नहीं करेगा। इसके बजाय स्टेटस बार और नेविगेशन बार आदि की ऊंचाई प्राप्त करें और अपने ऐप के विंडो के आकार की तुलना करें।

इस तरह:

    private ViewTreeObserver.OnGlobalLayoutListener keyboardLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // navigation bar height
        int navigationBarHeight = 0;
        int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android");
        if (resourceId > 0) {
            navigationBarHeight = getResources().getDimensionPixelSize(resourceId);
        }

        // status bar height
        int statusBarHeight = 0;
        resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            statusBarHeight = getResources().getDimensionPixelSize(resourceId);
        }

        // display window size for the app layout
        Rect rect = new Rect();
        getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);

        // screen height - (user app height + status + nav) ..... if non-zero, then there is a soft keyboard
        int keyboardHeight = rootLayout.getRootView().getHeight() - (statusBarHeight + navigationBarHeight + rect.height());

        if (keyboardHeight <= 0) {
            onHideKeyboard();
        } else {
            onShowKeyboard(keyboardHeight);
        }
    }
};

एक अपवाद के साथ बहुत अच्छा काम करता है: विभाजन स्क्रीन मोड में टूट जाता है। नहीं तो बहुत अच्छा है।
MCLLC

14

आप इसे आज़मा सकते हैं:

private void initKeyBoardListener() {
    // Минимальное значение клавиатуры. 
    // Threshold for minimal keyboard height.
    final int MIN_KEYBOARD_HEIGHT_PX = 150;
    // Окно верхнего уровня view. 
    // Top-level window decor view.
    final View decorView = getWindow().getDecorView();
    // Регистрируем глобальный слушатель. Register global layout listener.
    decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        // Видимый прямоугольник внутри окна. 
        // Retrieve visible rectangle inside window.
        private final Rect windowVisibleDisplayFrame = new Rect();
        private int lastVisibleDecorViewHeight;

        @Override
        public void onGlobalLayout() {
            decorView.getWindowVisibleDisplayFrame(windowVisibleDisplayFrame);
            final int visibleDecorViewHeight = windowVisibleDisplayFrame.height();

            if (lastVisibleDecorViewHeight != 0) {
                if (lastVisibleDecorViewHeight > visibleDecorViewHeight + MIN_KEYBOARD_HEIGHT_PX) {
                    Log.d("Pasha", "SHOW");
                } else if (lastVisibleDecorViewHeight + MIN_KEYBOARD_HEIGHT_PX < visibleDecorViewHeight) {
                    Log.d("Pasha", "HIDE");
                }
            }
            // Сохраняем текущую высоту view до следующего вызова.
            // Save current decor view height for the next call.
            lastVisibleDecorViewHeight = visibleDecorViewHeight;
        }
    });
}

Spasibo, Dolbik! :)
एलेक्सा डिस

4

आप मेरे Rx एक्सटेंशन फ़ंक्शन (कोटलिन) का उपयोग कर सकते हैं।

/**
 * @return [Observable] to subscribe of keyboard visibility changes.
 */
fun AppCompatActivity.keyboardVisibilityChanges(): Observable<Boolean> {

    // flag indicates whether keyboard is open
    var isKeyboardOpen = false

    val notifier: BehaviorSubject<Boolean> = BehaviorSubject.create()

    // approximate keyboard height
    val approximateKeyboardHeight = dip(100)

    // device screen height
    val screenHeight: Int = getScreenHeight()

    val visibleDisplayFrame = Rect()

    val viewTreeObserver = window.decorView.viewTreeObserver

    val onDrawListener = ViewTreeObserver.OnDrawListener {

        window.decorView.getWindowVisibleDisplayFrame(visibleDisplayFrame)

        val keyboardHeight = screenHeight - (visibleDisplayFrame.bottom - visibleDisplayFrame.top)

        val keyboardOpen = keyboardHeight >= approximateKeyboardHeight

        val hasChanged = isKeyboardOpen xor keyboardOpen

        if (hasChanged) {
            isKeyboardOpen = keyboardOpen
            notifier.onNext(keyboardOpen)
        }
    }

    val lifeCycleObserver = object : GenericLifecycleObserver {
        override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event?) {
            if (source.lifecycle.currentState == Lifecycle.State.DESTROYED) {
                viewTreeObserver.removeOnDrawListener(onDrawListener)
                source.lifecycle.removeObserver(this)
                notifier.onComplete()
            }
        }
    }

    viewTreeObserver.addOnDrawListener(onDrawListener)
    lifecycle.addObserver(lifeCycleObserver)

    return notifier
            .doOnDispose {
                viewTreeObserver.removeOnDrawListener(onDrawListener)
                lifecycle.removeObserver(lifeCycleObserver)
            }
            .onTerminateDetach()
            .hide()
}

उदाहरण:

(context as AppCompatActivity)
                    .keyboardVisibilityChanges()
                    .subscribeBy { isKeyboardOpen ->
                        // your logic
                    }

मेरे लिए काम नहीं करता है। तरीकों dip()औरgetScreenHeight()
Marcin Kunert

@MarcinKunert यह केवल एक्सटेंशन फ़ंक्शन है जो पिक्सेल को dp में बदलने और स्क्रीन की ऊँचाई प्राप्त करने में आपकी सहायता करता है। यदि आप चाहें, तो मैं आपको ऐसे कार्यों का उदाहरण दे सकता हूं
व्लाद

GenericLifecycleObserver को हटा दिया जाता है? कोई भी समाधान?
ज़ैनल फ़हरुद्दीन

4

नीचे दिया गया कोड मेरे लिए काम कर रहा है,

mainLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (mainLayout != null) {
                int heightDiff = mainLayout.getRootView().getHeight() - mainLayout.getHeight();
                if (heightDiff > dpToPx(getActivity(), 200)) { 
                   //keyboard is open
                } else {
                   //keyboard is hide
                }
            }
        }
    });

2

यदि आप कर सकते हैं, तो EditText का विस्तार करने और 'onKeyPreIme' पद्धति को ओवरराइड करने का प्रयास करें।

@Override
public void setOnEditorActionListener(final OnEditorActionListener listener) {
    mEditorListener = listener; //keep it for later usage
    super.setOnEditorActionListener(listener);
}

@Override
public boolean onKeyPreIme(final int keyCode, final KeyEvent event) {
    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
        if (mEditorListener != null) {
            //you can define and use custom listener,
            //OR define custom R.id.<imeId>
            //OR check event.keyCode in listener impl
            //* I used editor action because of ButterKnife @
            mEditorListener.onEditorAction(this, android.R.id.closeButton, event);
        }
    }
    return super.onKeyPreIme(keyCode, event);
}

आप इसे कैसे बढ़ा सकते हैं:

  1. सुनने और 'onKeyboardShown' की घोषणा पर लागू करें
  2. 'onKeyboardHidden' घोषित करें

मुझे लगता है, स्क्रीन ऊंचाई का पुनर्गणना 100% सफलतापूर्वक नहीं है जैसा कि पहले उल्लेख किया गया है। स्पष्ट होने के लिए, 'onKeyPreIme' के ओवरराइडिंग को 'सॉफ्ट कीबोर्ड को प्रोग्रामिक रूप से छिपाने' के तरीकों पर नहीं कहा जाता है, लेकिन अगर आप इसे कहीं भी कर रहे हैं, तो आपको वहां 'onKeyboardHidden' लॉजिक करना चाहिए और एक व्यापक समाधान नहीं बनाना चाहिए।


1
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainactivity);
    attachKeyboardListeners();
    ....
    yourEditText1.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                yourEditText2.setVisibility(View.GONE);
                yourEditText3.setVisibility(View.GONE);
                yourEditText4.setVisibility(View.GONE);
                yourEditText5.setVisibility(View.GONE);
            } else {
                yourEditText2.setVisibility(View.VISIBLE);
                yourEditText3.setVisibility(View.VISIBLE);
                yourEditText4.setVisibility(View.VISIBLE);
                yourEditText5.setVisibility(VISIBLE);
            }
       }
    });
    }
}

मान लीजिए मैं एडिटेक्स पर क्लिक करता हूं तो यह setOnFocusChangeListenerश्रोता कहलाएगा फिर मैं वापस दबाता हूं तो यह कीबोर्ड को बंद कर देता है लेकिन अन्य दृश्यों पर क्लिक नहीं करता है, अब फिर से मैं उसी एडिटेक्स पर क्लिक करता हूं जिसमें पहले से ही फोकस है फिर क्या होगा?
एन शर्मा

यह मेरा सवाल नहीं है। कृपया मेरे प्रश्न को फिर से पढ़ें - मेरे पास गतिविधि है जहाँ 5 EditText हैं। जब उपयोगकर्ता पहले EditText पर क्लिक करता है तो उसमें कुछ मूल्य दर्ज करने के लिए सॉफ्ट कीबोर्ड खुला होता है। मैं कुछ अन्य दृश्य दृश्यता सेट करना चाहता हूं जब सॉफ्ट कीबोर्ड खुला होता है जब उपयोगकर्ता पहले एडिट टेक्स्ट पर क्लिक करता है और जब सॉफ्ट कीबोर्ड बैक एडिट पर एक ही एडिट टेक्स्ट से बंद होता है तो मैं कुछ अन्य दृश्य दृश्यता सेट करना चाहता हूं। क्या कोई श्रोता या कॉलबैक या कोई हैक होता है जब एंड्रॉइड में पहले एडिट टेक्स्ट पर क्लिक करने पर सॉफ्ट कीबोर्ड खुलता है?
एन शर्मा

1
जब आप वापस प्रेस तो यह कीबोर्ड ख़ारिज समय है कि onfocusश्रोता फोन कभी नहीं कि की मैं नहीं देख रहा हूँ आप सुझाव दे रहे हैं जो है
एन शर्मा

1

इस वर्ग का उपयोग करें,

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;

import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

public class SoftKeyboard implements View.OnFocusChangeListener
{
private static final int CLEAR_FOCUS = 0;

private ViewGroup layout;
private int layoutBottom;
private InputMethodManager im;
private int[] coords;
private boolean isKeyboardShow;
private SoftKeyboardChangesThread softKeyboardThread;
private List<EditText> editTextList;

private View tempView; // reference to a focused EditText

public SoftKeyboard(ViewGroup layout, InputMethodManager im)
{
    this.layout = layout;
    keyboardHideByDefault();
    initEditTexts(layout);
    this.im = im;
    this.coords = new int[2];
    this.isKeyboardShow = false;
    this.softKeyboardThread = new SoftKeyboardChangesThread();
    this.softKeyboardThread.start();
}

public void openSoftKeyboard()
{
    if(!isKeyboardShow)
    {
        layoutBottom = getLayoutCoordinates();
        im.toggleSoftInput(0, InputMethodManager.SHOW_IMPLICIT);
        softKeyboardThread.keyboardOpened();
        isKeyboardShow = true;
    }
}

public void closeSoftKeyboard()
{
    if(isKeyboardShow)
    {
        im.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
        isKeyboardShow = false;
    }
}

public void setSoftKeyboardCallback(SoftKeyboardChanged mCallback)
{
    softKeyboardThread.setCallback(mCallback);
}

public void unRegisterSoftKeyboardCallback()
{
    softKeyboardThread.stopThread();
}

public interface SoftKeyboardChanged 
{
    public void onSoftKeyboardHide();
    public void onSoftKeyboardShow();   
}

private int getLayoutCoordinates()
{
    layout.getLocationOnScreen(coords);
    return coords[1] + layout.getHeight();
}

private void keyboardHideByDefault()
{
    layout.setFocusable(true);
    layout.setFocusableInTouchMode(true);
}

/*
 * InitEditTexts now handles EditTexts in nested views
 * Thanks to Francesco Verheye (verheye.francesco@gmail.com)
 */
private void initEditTexts(ViewGroup viewgroup) 
{
    if(editTextList == null)
        editTextList = new ArrayList<EditText>();

    int childCount = viewgroup.getChildCount();
    for(int i=0; i<= childCount-1;i++) 
    {
        View v = viewgroup.getChildAt(i);

        if(v instanceof ViewGroup) 
        {
            initEditTexts((ViewGroup) v);
        }

        if(v instanceof EditText) 
        {
            EditText editText = (EditText) v;
            editText.setOnFocusChangeListener(this);
            editText.setCursorVisible(true);
            editTextList.add(editText);
        }
    }
}

/*
 * OnFocusChange does update tempView correctly now when keyboard is still shown
 * Thanks to Israel Dominguez (dominguez.israel@gmail.com)
 */
@Override
public void onFocusChange(View v, boolean hasFocus) 
{
    if(hasFocus) 
    {
        tempView = v;
        if(!isKeyboardShow) 
        {
            layoutBottom = getLayoutCoordinates();
            softKeyboardThread.keyboardOpened();
            isKeyboardShow = true;
        }
    }
}

// This handler will clear focus of selected EditText
private final Handler mHandler = new Handler()
{
    @Override
    public void handleMessage(Message m)
    {
        switch(m.what)
        {
        case CLEAR_FOCUS:
            if(tempView != null)
            {
                tempView.clearFocus();
                tempView = null;
            }
            break;
        }
    }
};

private class SoftKeyboardChangesThread extends Thread
{
    private AtomicBoolean started;
    private SoftKeyboardChanged mCallback;

    public SoftKeyboardChangesThread()
    {
        started = new AtomicBoolean(true);
    }

    public void setCallback(SoftKeyboardChanged mCallback)
    {
        this.mCallback = mCallback;
    }

    @Override
    public void run()
    {
        while(started.get())
        {
            // Wait until keyboard is requested to open
            synchronized(this)
            {
                try 
                {
                    wait();
                } catch (InterruptedException e) 
                {
                    e.printStackTrace();
                }
            }

            int currentBottomLocation = getLayoutCoordinates();

            // There is some lag between open soft-keyboard function and when it really appears.
            while(currentBottomLocation == layoutBottom && started.get())
            {
                currentBottomLocation = getLayoutCoordinates();
            }

            if(started.get())
                mCallback.onSoftKeyboardShow();

            // When keyboard is opened from EditText, initial bottom location is greater than layoutBottom
            // and at some moment equals layoutBottom.
            // That broke the previous logic, so I added this new loop to handle this.
            while(currentBottomLocation >= layoutBottom && started.get())
            {
                currentBottomLocation = getLayoutCoordinates();
            }

            // Now Keyboard is shown, keep checking layout dimensions until keyboard is gone
            while(currentBottomLocation != layoutBottom && started.get())
            {
                                    synchronized(this)
                {
                    try 
                    {
                        wait(500);
                    } catch (InterruptedException e) 
                    {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                currentBottomLocation = getLayoutCoordinates();
            }

            if(started.get())
                mCallback.onSoftKeyboardHide();

            // if keyboard has been opened clicking and EditText.
            if(isKeyboardShow && started.get())
                isKeyboardShow = false;

            // if an EditText is focused, remove its focus (on UI thread)
            if(started.get())
                mHandler.obtainMessage(CLEAR_FOCUS).sendToTarget();
        }   
    }

    public void keyboardOpened()
    {
        synchronized(this)
        {
            notify();
        }
    }

    public void stopThread()
    {
        synchronized(this)
        {
            started.set(false);
            notify();
        }
    }

}
}

में Android Manifest, android:windowSoftInputMode="adjustResize"आवश्यक है।

/*
Somewhere else in your code
*/
RelativeLayout mainLayout = findViewById(R.layout.main_layout); // You must use the layout root
InputMethodManager im = (InputMethodManager)getSystemService(Service.INPUT_METHOD_SERVICE);

/*
Instantiate and pass a callback
*/
SoftKeyboard softKeyboard;
softKeyboard = new SoftKeyboard(mainLayout, im);
softKeyboard.setSoftKeyboardCallback(new SoftKeyboard.SoftKeyboardChanged() {

@Override
public void onSoftKeyboardHide()  {
    // Code here
}

@Override
public void onSoftKeyboardShow() {
    // Code here
}   
});

/*
Open or close the soft keyboard easily
*/
softKeyboard.openSoftKeyboard();
softKeyboard.closeSoftKeyboard();

/* Prevent memory leaks:*/
@Override
public void onDestroy() {
    super.onDestroy();
    softKeyboard.unRegisterSoftKeyboardCallback();
}

पुनश्च - पूरी तरह से यहाँ से लिया गया ।


1

के मामले के लिए adjustResizeऔर FragmentActivity @Jaap से स्वीकृत समाधान मेरे लिए काम नहीं करता है।

यहाँ मेरा समाधान है:

private ViewTreeObserver.OnGlobalLayoutListener keyboardLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
    private int contentDiff;
    private int rootHeight;
    @Override
    public void onGlobalLayout() {
        View contentView = getWindow().findViewById(Window.ID_ANDROID_CONTENT);
        if (rootHeight != mDrawerLayout.getRootView().getHeight()) {
            rootHeight = mDrawerLayout.getRootView().getHeight();
            contentDiff = rootHeight - contentView.getHeight();
            return;
        }
        int newContentDiff = rootHeight - contentView.getHeight();
        if (contentDiff != newContentDiff) {
            if (contentDiff < newContentDiff) {
                onShowKeyboard(newContentDiff - contentDiff);
            } else {
                onHideKeyboard();
            }
            contentDiff = newContentDiff;
        }
    }
};

1

जब उपयोगकर्ता ने टाइप करना बंद कर दिया है, तो एक अलग दृष्टिकोण होगा ...

जब कोई TextEdit फ़ोकस में हो (उपयोगकर्ता टाइप कर रहा है) तो आप विचार छिपा सकते हैं (फोकस श्रोता)

और कीबोर्ड को बंद करने के लिए हैंडलर + रननेबल और टेक्स्ट चेंज श्रोता का उपयोग करें (इसकी दृश्यता की परवाह किए बिना) और कुछ देरी के बाद विचार दिखाएं।

आपके द्वारा उपयोग की जाने वाली देरी के लिए मुख्य बात यह है कि इन TextEdits की सामग्री पर निर्भर करेगा।

Handler timeoutHandler = new Handler();
Runnable typingRunnable = new Runnable() {
    public void run() {
        // current TextEdit
        View view = getCurrentFocus();

        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        // reset focus
        view.clearFocus();
        // close keyboard (whether its open or not)
        imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);

        // SET VIEWS VISIBLE
    }
};

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            // SET VIEWS GONE

            // reset handler
            timeoutHandler.removeCallbacks(typingRunnable);
            timeoutHandler.postDelayed(typingRunnable, TYPING_TIMEOUT);
        }
    }
});

editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        // Reset Handler...
        timeoutHandler.removeCallbacks(typingRunnable);
    }

    @Override
    public void afterTextChanged(Editable s) {
        // Reset Handler Cont.
        if (editText.getText().toString().trim().length() > 0) {
            timeoutHandler.postDelayed(typingRunnable, TYPING_TIMEOUT);
        }
    }
});

1

यह कोड बहुत अच्छा काम करता है

रूट दृश्य के लिए इस वर्ग का उपयोग करें:

public class KeyboardConstraintLayout extends ConstraintLayout {

private KeyboardListener keyboardListener;
private EditText targetEditText;
private int minKeyboardHeight;
private boolean isShow;

public KeyboardConstraintLayout(Context context) {
    super(context);
    minKeyboardHeight = getResources().getDimensionPixelSize(R.dimen.keyboard_min_height); //128dp
}

public KeyboardConstraintLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    minKeyboardHeight = getResources().getDimensionPixelSize(R.dimen.keyboard_min_height); // 128dp
}

public KeyboardConstraintLayout(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    minKeyboardHeight = getResources().getDimensionPixelSize(R.dimen.keyboard_min_height); // 128dp
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if (!isInEditMode()) {
        Activity activity = (Activity) getContext();
        @SuppressLint("DrawAllocation")
        Rect rect = new Rect();
        getWindowVisibleDisplayFrame(rect);

        int statusBarHeight = rect.top;
        int keyboardHeight = activity.getWindowManager().getDefaultDisplay().getHeight() - (rect.bottom - rect.top) - statusBarHeight;

        if (keyboardListener != null && targetEditText != null && targetEditText.isFocused()) {
            if (keyboardHeight > minKeyboardHeight) {
                if (!isShow) {
                    isShow = true;
                    keyboardListener.onKeyboardVisibility(true);
                }
            }else {
                if (isShow) {
                    isShow = false;
                    keyboardListener.onKeyboardVisibility(false);
                }
            }
        }
    }
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

public boolean isShowKeyboard() {
    return isShow;
}

public void setKeyboardListener(EditText targetEditText, KeyboardListener keyboardListener) {
    this.targetEditText = targetEditText;
    this.keyboardListener = keyboardListener;
}

public interface KeyboardListener {
    void onKeyboardVisibility (boolean isVisible);
}

}

और गतिविधि या टुकड़े में कीबोर्ड श्रोता सेट करें:

        rootLayout.setKeyboardListener(targetEditText, new KeyboardConstraintLayout.KeyboardListener() {
        @Override
        public void onKeyboardVisibility(boolean isVisible) {

        }
    });

1

आप अपनी गतिविधि में दो तरीकों को ओवरराइड करके कीबोर्ड दृश्यता को संभाल सकते हैं: onKeyUp()और onKeyDown()इस लिंक में अधिक जानकारी: https://developer.android.com/training/keyboard-input/commands


1
डॉक्स वास्तव में निर्दिष्ट करते हैं कि इस फ़ंक्शन का उपयोग सॉफ्ट इनपुट कीबोर्ड के संदर्भ में नहीं किया जाना चाहिए।
पायोत्र प्रुस

0

दुर्भाग्य से जाप वैन हेंगस्टम के जवाब पर टिप्पणी करने के लिए मेरे पास पर्याप्त उच्च प्रतिष्ठा नहीं है। लेकिन मैं लोगों की कुछ टिप्पणियों को पढ़ता हूं, जो contentViewTopहमेशा होती है 0और जिसे onShowKeyboard(...)हमेशा कहा जाता है।

मेरे पास एक ही मुद्दा था और मुझे जो समस्या थी उसका पता लगा। मैंने AppCompatActivityएक 'सामान्य' के बजाय इस्तेमाल किया Activity। इस मामले में सही शीर्ष मूल्य के साथ नहीं करने के Window.ID_ANDROID_CONTENTलिए संदर्भित करता है । मेरे मामले में 'सामान्य' का उपयोग करना ठीक था , अगर आपको किसी अन्य गतिविधि-प्रकार का उपयोग करना है (मैंने अभी परीक्षण किया है , तो शायद यह अन्य एसिटिव-प्रकारों के साथ भी एक मुद्दा है ), आपको एक्सेस करना होगा , जो है के पूर्वज ।ContentFrameLayoutFrameLayoutActivityAppCompatActivityFragmentActivityFrameLayoutContentFrameLayout


0

जब कीबोर्ड दिखा

rootLayout.getHeight() < rootLayout.getRootView().getHeight() - getStatusBarHeight() 

सच है, और छिपाओ


0
private boolean isKeyboardShown = false;
private int prevContentHeight = 0;
private ViewGroup contentLayout;

private ViewTreeObserver.OnGlobalLayoutListener keyboardLayoutListener =
        new ViewTreeObserver.OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {
        int contentHeight = contentLayout.getHeight();
        int rootViewHeight = contentLayout.getRootView().getHeight();

        if (contentHeight > 0) {

            if (!isKeyboardShown) {
                if (contentHeight < prevContentHeight) {
                    isKeyboardShown = true;
                    onShowKeyboard(rootViewHeight - contentHeight);
                }
            } else {
                if (contentHeight > prevContentHeight) {
                    isKeyboardShown = false;
                    onHideKeyboard();
                }
            }

            prevContentHeight = contentHeight;
        }
    }
};

मैंने जाप के स्वीकृत उत्तर को थोड़ा संशोधित किया है। लेकिन मेरे मामले में, कुछ धारणाएं हैं जैसे कि android:windowSoftInputMode=adjustResizeऔर ऐप शुरू होने पर कीबोर्ड शुरुआत में दिखाई नहीं देता है। और यह भी, मुझे लगता है कि संबंध में स्क्रीन माता-पिता की ऊंचाई से मेल खाती है।

contentHeight > 0यह जांच मुझे यह जानने के लिए प्रदान करती है कि क्या संबंधित स्क्रीन छिपी हुई है या इस विशिष्ट स्क्रीन के लिए सुनने वाले कीबोर्ड इवेंट को लागू करने के लिए दिखाया गया है। इसके अलावा मैं attachKeyboardListeners(<your layout view here>)अपनी मुख्य गतिविधि के onCreate()तरीके में संबंधित स्क्रीन के लेआउट दृश्य को पास करता हूं । हर बार जब संबंधित स्क्रीन की ऊंचाई बदलती है, तो मैं इसे prevContentHeightबाद में जाँचने के लिए चर में सहेजता हूं कि क्या कीबोर्ड दिखाया गया है या छिपा हुआ है।

मेरे लिए, अब तक यह बहुत अच्छी तरह से काम किया गया है। मुझे उम्मीद है कि यह दूसरों के लिए भी काम करता है।


0

"Jaap van Hengstum" का जवाब मेरे लिए काम कर रहा है, लेकिन "android: windowSoftInputMode" सेट करने की कोई आवश्यकता नहीं है, जैसा कि उन्होंने अभी कहा!

मैंने इसे छोटा कर दिया है (यह अब सिर्फ यह पता लगाता है कि मुझे क्या चाहिए, वास्तव में कीबोर्ड को दिखाने और छिपाने पर एक घटना है):

private ViewTreeObserver.OnGlobalLayoutListener keyboardLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        int heightDiff = rootLayout.getRootView().getHeight() - rootLayout.getHeight();
        int contentViewTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
        if(heightDiff <= contentViewTop){
            onHideKeyboard();
        } else {
            onShowKeyboard();
        }
    }
};

private boolean keyboardListenersAttached = false;
private ViewGroup rootLayout;

protected void onShowKeyboard() {}
protected void onHideKeyboard() {}

protected void attachKeyboardListeners() {
    if (keyboardListenersAttached) {
        return;
    }

    rootLayout = (ViewGroup) findViewById(R.id.CommentsActivity);
    rootLayout.getViewTreeObserver().addOnGlobalLayoutListener(keyboardLayoutListener);

    keyboardListenersAttached = true;
}

@Override
protected void onDestroy() {
    super.onDestroy();

    if (keyboardListenersAttached) {
        rootLayout.getViewTreeObserver().removeGlobalOnLayoutListener(keyboardLayoutListener);
    }
}

और बस इसे जोड़ना मत भूलना

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_comments);
    attachKeyboardListeners();}

0

यह आपकी गतिविधि को बदलने की आवश्यकता के बिना काम करेगा android:windowSoftInputMode

चरण 1: EditText वर्ग का विस्तार करें और इन दोनों को ओवरराइड करें:

@Override
public void setOnEditorActionListener(final OnEditorActionListener listener) {
    mEditorListener = listener;
    super.setOnEditorActionListener(listener);
}

@Override
public boolean onKeyPreIme(final int keyCode, final KeyEvent event) {
    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
        if (mEditorListener != null) {
            mEditorListener.onEditorAction(this, android.R.id.closeButton, event);
        }
    }
    return super.onKeyPreIme(keyCode, event);
}

चरण 2: अपनी गतिविधि में इन दोनों को बनाएं:

private void initKeyboard() {
    final AppEditText editText = findViewById(R.id.some_id);
    editText.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            setKeyboard(hasFocus);
        }
    });
    editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (event == null || event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
                editText.clearFocus();
            }
            return false;
        }
    });
}

public void setKeyboard(boolean isShowing) {
    // do something
}

*** याद रखें कि clearFocusकाम करने के लिए , आपको माता-पिता या पहले बच्चे को माता-पिता के पदानुक्रम में ध्यान देने योग्य बनाना होगा।

    setFocusableInTouchMode(true);
    setFocusable(true);

0

यह वांछित के रूप में काम नहीं कर रहा है ...

... जाँच के लिए कई उपयोग आकार गणनाएँ देखी हैं ...

मैं यह निर्धारित करना चाहता था कि यह खुला था या नहीं और मैंने पाया isAcceptingText()

इसलिए यह वास्तव में इस सवाल का जवाब नहीं देता है क्योंकि यह उद्घाटन या समापन को संबोधित नहीं करता है बल्कि अधिक खुला या बंद है इसलिए यह संबंधित कोड है जो विभिन्न परिदृश्यों में दूसरों की मदद कर सकता है ...

एक गतिविधि में

    if (((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).isAcceptingText()) {
        Log.d(TAG,"Software Keyboard was shown");
    } else {
        Log.d(TAG,"Software Keyboard was not shown");
    }

एक टुकड़े में

    if (((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).isAcceptingText()) {
        Log.d(TAG,"Software Keyboard was shown");
    } else {
        Log.d(TAG,"Software Keyboard was not shown");

    }

0

नीचे दिए गए कोड के साथ जांचें:

XML कोड:

<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/coordinatorParent"
    style="@style/parentLayoutPaddingStyle"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  .................


</android.support.constraint.ConstraintLayout>

जावा कोड:

//Global Variable
android.support.constraint.ConstraintLayout activityRootView;
boolean isKeyboardShowing = false;
private  ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener;
android.support.constraint.ConstraintLayout.LayoutParams layoutParams;




 //onCreate or onViewAttached
    activityRootView = view.findViewById(R.id.coordinatorParent);
        onGlobalLayoutListener = onGlobalLayoutListener();
        activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);


  //outside oncreate
  ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener() {
        return new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Rect r = new Rect();
                activityRootView.getWindowVisibleDisplayFrame(r);
                int screenHeight = activityRootView.getRootView().getHeight();
                int keypadHeight = screenHeight - r.bottom;

                if (keypadHeight > screenHeight * 0.15) { // 0.15 ratio is perhaps enough to determine keypad height.
                    if (!isKeyboardShowing) {  // keyboard is opened
                        isKeyboardShowing = true;
                        onKeyboardVisibilityChanged(true);
                   }
                }
                else {
                    if (isKeyboardShowing) {   // keyboard is closed
                        isKeyboardShowing = false;
                        onKeyboardVisibilityChanged(false);
                    }
                }
            }//ends here
        };

    }


    void onKeyboardVisibilityChanged(boolean value) {
        layoutParams = (android.support.constraint.ConstraintLayout.LayoutParams)topImg.getLayoutParams();

        if(value){
           int length = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 90, getResources().getDisplayMetrics());
            layoutParams.height= length;
            layoutParams.width = length;
            topImg.setLayoutParams(layoutParams);
            Log.i("keyboard " ,""+ value);
        }else{
            int length1 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 175, getResources().getDisplayMetrics());
            layoutParams.height= length1;
            layoutParams.width = length1;
            topImg.setLayoutParams(layoutParams);
            Log.i("keyboard " ,""+ value);
        }
    }


    @Override
    public void onDetach() {
        super.onDetach();
        if(onGlobalLayoutListener != null) {
            activityRootView.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener);
        }
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.