diff --git a/build.gradle b/build.gradle index e648911..9db686d 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.0' + classpath 'com.android.tools.build:gradle:3.4.1' classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' } diff --git a/vertical-stepper-form/src/main/java/ernestoyaquello/com/verticalstepperform/VerticalStepperFormView.java b/vertical-stepper-form/src/main/java/ernestoyaquello/com/verticalstepperform/VerticalStepperFormView.java index 816e3a2..94bfa3c 100644 --- a/vertical-stepper-form/src/main/java/ernestoyaquello/com/verticalstepperform/VerticalStepperFormView.java +++ b/vertical-stepper-form/src/main/java/ernestoyaquello/com/verticalstepperform/VerticalStepperFormView.java @@ -32,7 +32,9 @@ public class VerticalStepperFormView extends LinearLayout { FormStyle style; private StepperFormListener listener; + private KeyboardTogglingObserver keyboardTogglingObserver; private List stepHelpers; + private boolean initialized; private LinearLayout formContentView; private ScrollView stepsScrollView; @@ -455,6 +457,8 @@ private void onConstructed(Context context, AttributeSet attrs, int defStyleAttr LayoutInflater inflater = LayoutInflater.from(context); inflater.inflate(R.layout.vertical_stepper_form_layout, this, true); + keyboardTogglingObserver = new KeyboardTogglingObserver(); + style = new FormStyle(); // Set the default values for all the style properties @@ -663,15 +667,14 @@ void initializeForm(StepperFormListener listener, StepHelper[] stepsArray) { hideBottomNavigation(); } - keyboardIsOpen = isKeyboardOpen(); - setObserverForKeyboard(); - for (int i = 0; i < stepHelpers.size(); i++) { View stepLayout = initializeStepHelper(i); formContentView.addView(stepLayout); } goToStep(0, false); + + initialized = true; } private View initializeStepHelper(int position) { @@ -765,28 +768,6 @@ private void enableOrDisableLastStepNextButton() { } } - private void setObserverForKeyboard() { - getRootView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - boolean keyboardWasOpen = keyboardIsOpen; - keyboardIsOpen = isKeyboardOpen(); - if (keyboardIsOpen != keyboardWasOpen) { - scrollToOpenStepIfNecessary(true); - } - } - }); - } - - private boolean isKeyboardOpen() { - Rect r = new Rect(); - formContentView.getWindowVisibleDisplayFrame(r); - int screenHeight = formContentView.getRootView().getHeight(); - int keyboardHeight = screenHeight - r.bottom; - - return keyboardHeight > screenHeight * 0.2; - } - private synchronized void attemptToCompleteForm(boolean isCancellation) { if (formCompleted) { return; @@ -857,6 +838,33 @@ public void onClick(View view) { goToNextStep(true); } }); + + addObserverForKeyboard(); + } + + @Override + protected void onDetachedFromWindow() { + removeObserverForKeyboard(); + + super.onDetachedFromWindow(); + } + + private void addObserverForKeyboard() { + keyboardIsOpen = isKeyboardOpen(); + getRootView().getViewTreeObserver().addOnGlobalLayoutListener(keyboardTogglingObserver); + } + + private void removeObserverForKeyboard() { + getRootView().getViewTreeObserver().removeOnGlobalLayoutListener(keyboardTogglingObserver); + } + + private boolean isKeyboardOpen() { + Rect r = new Rect(); + formContentView.getWindowVisibleDisplayFrame(r); + int screenHeight = formContentView.getRootView().getHeight(); + int keyboardHeight = screenHeight - r.bottom; + + return keyboardHeight > screenHeight * 0.2; } private void restoreFromState( @@ -1025,4 +1033,16 @@ class FormStyle { boolean allowStepOpeningOnHeaderClick; float alphaOfDisabledElements; } + + private class KeyboardTogglingObserver implements ViewTreeObserver.OnGlobalLayoutListener { + + @Override + public void onGlobalLayout() { + boolean keyboardWasOpen = keyboardIsOpen; + keyboardIsOpen = isKeyboardOpen(); + if (initialized && keyboardIsOpen != keyboardWasOpen) { + scrollToOpenStepIfNecessary(true); + } + } + } } \ No newline at end of file