Skip to content

Commit 5d6678c

Browse files
pubiqqleticiarossi
authored andcommittedMay 11, 2022
[MaterialDatePicker] Hide the keyboard when switching to calendar mode
Resolves #2688 Resolves #2687 GIT_ORIGIN_REV_ID=686526aa049eadb08ded72ca9eb0b60027358756 PiperOrigin-RevId: 447819486
1 parent 14578ed commit 5d6678c

File tree

5 files changed

+38
-15
lines changed

5 files changed

+38
-15
lines changed
 

‎lib/java/com/google/android/material/datepicker/DateSelector.java

+24
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@
2424
import android.view.View;
2525
import android.view.ViewGroup;
2626
import android.widget.AdapterView;
27+
import android.widget.EditText;
2728
import androidx.annotation.NonNull;
2829
import androidx.annotation.Nullable;
2930
import androidx.annotation.RestrictTo;
3031
import androidx.annotation.RestrictTo.Scope;
3132
import androidx.annotation.StringRes;
3233
import androidx.annotation.StyleRes;
3334
import androidx.core.util.Pair;
35+
import com.google.android.material.internal.ViewUtils;
3436
import java.util.Collection;
3537

3638
/**
@@ -101,4 +103,26 @@ View onCreateTextInputView(
101103
@Nullable Bundle bundle,
102104
@NonNull CalendarConstraints constraints,
103105
@NonNull OnSelectionChangedListener<S> listener);
106+
107+
static void showKeyboardWithAutoHideBehavior(@NonNull EditText... editTexts) {
108+
if (editTexts.length == 0) {
109+
return;
110+
}
111+
112+
View.OnFocusChangeListener listener =
113+
(view, hasFocus) -> {
114+
for (EditText editText : editTexts) {
115+
if (editText.hasFocus()) {
116+
return;
117+
}
118+
}
119+
ViewUtils.hideKeyboard(view);
120+
};
121+
122+
for (EditText editText : editTexts) {
123+
editText.setOnFocusChangeListener(listener);
124+
}
125+
126+
ViewUtils.requestFocusAndShowKeyboard(editTexts[0]);
127+
}
104128
}

‎lib/java/com/google/android/material/datepicker/RangeDateSelector.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import androidx.core.util.Pair;
3636
import androidx.core.util.Preconditions;
3737
import com.google.android.material.internal.ManufacturerUtils;
38-
import com.google.android.material.internal.ViewUtils;
3938
import com.google.android.material.resources.MaterialAttributes;
4039
import com.google.android.material.textfield.TextInputLayout;
4140
import java.text.SimpleDateFormat;
@@ -232,7 +231,7 @@ void onInvalidDate() {
232231
}
233232
});
234233

235-
ViewUtils.requestFocusAndShowKeyboard(startEditText);
234+
DateSelector.showKeyboardWithAutoHideBehavior(startEditText, endEditText);
236235

237236
return root;
238237
}

‎lib/java/com/google/android/material/datepicker/SingleDateSelector.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import androidx.annotation.RestrictTo.Scope;
3434
import androidx.core.util.Pair;
3535
import com.google.android.material.internal.ManufacturerUtils;
36-
import com.google.android.material.internal.ViewUtils;
3736
import com.google.android.material.resources.MaterialAttributes;
3837
import com.google.android.material.textfield.TextInputLayout;
3938
import java.text.SimpleDateFormat;
@@ -133,7 +132,7 @@ void onInvalidDate() {
133132
}
134133
});
135134

136-
ViewUtils.requestFocusAndShowKeyboard(dateEditText);
135+
DateSelector.showKeyboardWithAutoHideBehavior(dateEditText);
137136

138137
return root;
139138
}

‎lib/java/com/google/android/material/internal/ViewUtils.java

+8
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.google.android.material.R;
2020

2121
import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
22+
import static androidx.core.content.ContextCompat.getSystemService;
2223

2324
import android.content.Context;
2425
import android.content.res.Resources;
@@ -97,6 +98,13 @@ public void run() {
9798
});
9899
}
99100

101+
public static void hideKeyboard(@NonNull final View view) {
102+
InputMethodManager imm = getSystemService(view.getContext(), InputMethodManager.class);
103+
if (imm != null) {
104+
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
105+
}
106+
}
107+
100108
/**
101109
* Wrapper around {@link androidx.core.view.OnApplyWindowInsetsListener} which also passes the
102110
* initial padding set on the view. Used with {@link #doOnApplyWindowInsets(View,

‎lib/java/com/google/android/material/timepicker/TimePickerTextInputPresenter.java

+4-11
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import com.google.android.material.R;
2020

2121
import static android.view.View.GONE;
22-
import static androidx.core.content.ContextCompat.getSystemService;
2322
import static com.google.android.material.timepicker.TimeFormat.CLOCK_12H;
2423
import static java.util.Calendar.AM;
2524
import static java.util.Calendar.HOUR;
@@ -38,7 +37,6 @@
3837
import android.text.TextWatcher;
3938
import android.view.View;
4039
import android.view.View.OnClickListener;
41-
import android.view.inputmethod.InputMethodManager;
4240
import android.widget.EditText;
4341
import android.widget.LinearLayout;
4442
import android.widget.TextView;
@@ -48,6 +46,7 @@
4846
import com.google.android.material.button.MaterialButtonToggleGroup.OnButtonCheckedListener;
4947
import com.google.android.material.color.MaterialColors;
5048
import com.google.android.material.internal.TextWatcherAdapter;
49+
import com.google.android.material.internal.ViewUtils;
5150
import com.google.android.material.timepicker.TimePickerView.OnSelectionChange;
5251
import java.lang.reflect.Field;
5352
import java.util.Locale;
@@ -236,16 +235,10 @@ public void show() {
236235
@Override
237236
public void hide() {
238237
View currentFocus = timePickerView.getFocusedChild();
239-
// Hide keyboard in case it was showing.
240-
if (currentFocus == null) {
241-
timePickerView.setVisibility(GONE);
242-
return;
243-
}
244-
Context context = timePickerView.getContext();
245-
InputMethodManager imm = getSystemService(context, InputMethodManager.class);
246-
if (imm != null) {
247-
imm.hideSoftInputFromWindow(currentFocus.getWindowToken(), 0);
238+
if (currentFocus != null) {
239+
ViewUtils.hideKeyboard(currentFocus);
248240
}
241+
249242
timePickerView.setVisibility(GONE);
250243
}
251244

0 commit comments

Comments
 (0)
Please sign in to comment.