Skip to content

Commit 9aceaca

Browse files
gupta-meghna64Vivek Maskara
authored and
Vivek Maskara
committed
Hide Keypad when EditText out of focus (commons-app#1168)
* Hide Keypad when EditText out of focus
1 parent 45aab1c commit 9aceaca

File tree

6 files changed

+119
-34
lines changed

6 files changed

+119
-34
lines changed

app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.accounts.AccountAuthenticatorActivity;
55
import android.accounts.AccountAuthenticatorResponse;
66
import android.accounts.AccountManager;
7+
import android.app.Activity;
78
import android.app.ProgressDialog;
89
import android.content.Intent;
910
import android.content.SharedPreferences;
@@ -17,10 +18,12 @@
1718
import android.support.v7.app.AppCompatDelegate;
1819
import android.text.Editable;
1920
import android.text.TextWatcher;
21+
import android.util.Log;
2022
import android.view.MenuInflater;
2123
import android.view.MenuItem;
2224
import android.view.View;
2325
import android.view.ViewGroup;
26+
import android.view.inputmethod.InputMethodManager;
2427
import android.widget.Button;
2528
import android.widget.EditText;
2629
import android.widget.TextView;
@@ -91,14 +94,33 @@ public void onCreate(Bundle savedInstanceState) {
9194
ButterKnife.bind(this);
9295

9396
usernameEdit.addTextChangedListener(textWatcher);
97+
usernameEdit.setOnFocusChangeListener((v, hasFocus) -> {
98+
if (!hasFocus) {
99+
hideKeyboard(v);
100+
}
101+
});
102+
94103
passwordEdit.addTextChangedListener(textWatcher);
104+
passwordEdit.setOnFocusChangeListener((v, hasFocus) -> {
105+
if (!hasFocus) {
106+
hideKeyboard(v);
107+
}
108+
});
109+
95110
twoFactorEdit.addTextChangedListener(textWatcher);
96111
passwordEdit.setOnEditorActionListener(newLoginInputActionListener());
97112

98113
loginButton.setOnClickListener(view -> performLogin());
99114
signupButton.setOnClickListener(view -> signUp());
100115
}
101116

117+
118+
public void hideKeyboard(View view) {
119+
InputMethodManager inputMethodManager =(InputMethodManager)this.getSystemService(Activity.INPUT_METHOD_SERVICE);
120+
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
121+
}
122+
123+
102124
@Override
103125
protected void onPostCreate(Bundle savedInstanceState) {
104126
super.onPostCreate(savedInstanceState);

app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
package fr.free.nrw.commons.category;
22

3+
import android.app.Activity;
34
import android.content.SharedPreferences;
45
import android.os.Bundle;
56
import android.support.v7.app.AlertDialog;
67
import android.support.v7.widget.LinearLayoutManager;
78
import android.support.v7.widget.RecyclerView;
9+
import android.text.Editable;
810
import android.text.TextUtils;
11+
import android.text.TextWatcher;
12+
import android.util.Log;
913
import android.view.LayoutInflater;
1014
import android.view.Menu;
1115
import android.view.MenuInflater;
1216
import android.view.MenuItem;
1317
import android.view.View;
1418
import android.view.ViewGroup;
19+
import android.view.inputmethod.InputMethodManager;
1520
import android.widget.EditText;
1621
import android.widget.ProgressBar;
1722
import android.widget.TextView;
@@ -37,6 +42,7 @@
3742
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
3843
import fr.free.nrw.commons.mwapi.MediaWikiApi;
3944
import fr.free.nrw.commons.upload.MwVolleyApi;
45+
import fr.free.nrw.commons.upload.SingleUploadFragment;
4046
import fr.free.nrw.commons.utils.StringSortingUtils;
4147
import io.reactivex.Observable;
4248
import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -72,6 +78,7 @@ public class CategorizationFragment extends CommonsDaggerSupportFragment {
7278
private OnCategoriesSaveHandler onCategoriesSaveHandler;
7379
private HashMap<String, ArrayList<String>> categoriesCache;
7480
private List<CategoryItem> selectedCategories = new ArrayList<>();
81+
private TitleTextWatcher textWatcher = new TitleTextWatcher();
7582

7683
private final CategoriesAdapterFactory adapterFactory = new CategoriesAdapterFactory(item -> {
7784
if (item.isSelected()) {
@@ -102,6 +109,15 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
102109
categoriesAdapter = adapterFactory.create(items);
103110
categoriesList.setAdapter(categoriesAdapter);
104111

112+
113+
categoriesFilter.addTextChangedListener(textWatcher);
114+
115+
categoriesFilter.setOnFocusChangeListener((v, hasFocus) -> {
116+
if (!hasFocus) {
117+
hideKeyboard(v);
118+
}
119+
});
120+
105121
RxTextView.textChanges(categoriesFilter)
106122
.takeUntil(RxView.detaches(categoriesFilter))
107123
.debounce(500, TimeUnit.MILLISECONDS)
@@ -110,6 +126,18 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
110126
return rootView;
111127
}
112128

129+
public void hideKeyboard(View view) {
130+
InputMethodManager inputMethodManager =(InputMethodManager)getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
131+
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
132+
}
133+
134+
@Override
135+
public void onDestroyView() {
136+
categoriesFilter.removeTextChangedListener(textWatcher);
137+
super.onDestroyView();
138+
}
139+
140+
113141
@Override
114142
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
115143
menu.clear();
@@ -351,4 +379,21 @@ private void showConfirmationDialog() {
351379
.create()
352380
.show();
353381
}
382+
383+
private class TitleTextWatcher implements TextWatcher {
384+
@Override
385+
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
386+
}
387+
388+
@Override
389+
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
390+
}
391+
392+
@Override
393+
public void afterTextChanged(Editable editable) {
394+
if (getActivity() != null) {
395+
getActivity().invalidateOptionsMenu();
396+
}
397+
}
398+
}
354399
}

app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package fr.free.nrw.commons.upload;
22

3+
import android.app.Activity;
34
import android.content.Context;
45
import android.graphics.Point;
56
import android.net.Uri;
@@ -10,6 +11,7 @@
1011
import android.text.TextUtils;
1112
import android.text.TextWatcher;
1213
import android.util.DisplayMetrics;
14+
import android.util.Log;
1315
import android.view.LayoutInflater;
1416
import android.view.Menu;
1517
import android.view.MenuInflater;
@@ -177,9 +179,21 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
177179
photosGrid.setColumnWidth(photoSize.x);
178180

179181
baseTitle.addTextChangedListener(textWatcher);
182+
183+
baseTitle.setOnFocusChangeListener((v, hasFocus) -> {
184+
if (!hasFocus) {
185+
hideKeyboard(v);
186+
}
187+
});
188+
180189
return view;
181190
}
182191

192+
public void hideKeyboard(View view) {
193+
InputMethodManager inputMethodManager =(InputMethodManager)getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
194+
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
195+
}
196+
183197
@Override
184198
public void onDestroyView() {
185199
baseTitle.removeTextChangedListener(textWatcher);

app/src/main/res/layout/activity_login.xml

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,16 @@
1919
android:layout_marginRight="@dimen/standard_gap"
2020
android:layout_marginStart="@dimen/standard_gap"
2121
android:layout_marginTop="@dimen/large_gap"
22+
android:clickable="true"
23+
android:focusableInTouchMode="true"
2224
app:cardCornerRadius="4dp"
2325
app:cardElevation="4dp">
2426

2527
<RelativeLayout
2628
android:layout_width="match_parent"
2729
android:layout_height="wrap_content"
30+
android:clickable="true"
31+
android:focusableInTouchMode="true"
2832
android:gravity="center"
2933
android:orientation="vertical">
3034

@@ -149,8 +153,8 @@
149153

150154
<Button
151155
android:id="@+id/signupButton"
152-
android:layout_width="0dp"
153156
style="@style/Widget.AppCompat.Button.Borderless.Colored"
157+
android:layout_width="0dp"
154158
android:layout_height="wrap_content"
155159
android:layout_gravity="center_horizontal"
156160
android:layout_marginEnd="@dimen/small_gap"
@@ -160,8 +164,8 @@
160164

161165
<Button
162166
android:id="@+id/loginButton"
163-
android:layout_width="0dp"
164167
style="@style/Widget.AppCompat.Button.Colored"
168+
android:layout_width="0dp"
165169
android:layout_height="wrap_content"
166170
android:layout_marginLeft="@dimen/small_gap"
167171
android:layout_marginStart="@dimen/small_gap"
@@ -188,19 +192,19 @@
188192
<android.support.v7.widget.AppCompatImageView
189193
android:layout_width="64dp"
190194
android:layout_height="64dp"
191-
android:elevation="8dp"
192-
tools:ignore="UnusedAttribute"
193195
android:layout_gravity="center_horizontal"
194-
app:srcCompat="@drawable/blue_rinse_circle" />
196+
android:elevation="8dp"
197+
app:srcCompat="@drawable/blue_rinse_circle"
198+
tools:ignore="UnusedAttribute" />
195199

196200
<android.support.v7.widget.AppCompatImageView
197201
android:layout_width="42dp"
198202
android:layout_height="42dp"
199203
android:layout_gravity="center_horizontal"
200204
android:layout_marginTop="8dp"
201-
tools:ignore="UnusedAttribute"
202205
android:elevation="8dp"
203-
app:srcCompat="@drawable/commons_logo_large" />
206+
app:srcCompat="@drawable/commons_logo_large"
207+
tools:ignore="UnusedAttribute" />
204208

205209
</FrameLayout>
206210

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,67 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3-
android:orientation="vertical"
43
android:layout_width="match_parent"
54
android:layout_height="match_parent"
65
android:background="?attr/fragmentCategorisationBackground"
6+
android:clickable="true"
7+
android:focusableInTouchMode="true"
8+
android:orientation="vertical"
79
android:paddingBottom="@dimen/small_gap"
10+
android:paddingEnd="@dimen/standard_gap"
811
android:paddingLeft="@dimen/standard_gap"
9-
android:paddingStart="@dimen/standard_gap"
1012
android:paddingRight="@dimen/standard_gap"
11-
android:paddingEnd="@dimen/standard_gap"
13+
android:paddingStart="@dimen/standard_gap"
1214
android:paddingTop="@dimen/small_gap"
13-
android:theme="@style/DarkAppTheme"
14-
>
15+
android:theme="@style/DarkAppTheme">
1516

1617
<FrameLayout
17-
android:layout_height="wrap_content"
1818
android:layout_width="match_parent"
19-
>
19+
android:layout_height="wrap_content"
20+
android:clickable="true"
21+
android:focusableInTouchMode="true">
2022

2123
<EditText
2224
android:id="@+id/categoriesSearchBox"
23-
android:layout_height="wrap_content"
2425
android:layout_width="match_parent"
26+
android:layout_height="wrap_content"
2527
android:hint="@string/categories_search_text_hint"
26-
android:maxLines="1"
27-
android:inputType="textCapWords"
2828
android:imeOptions="flagNoExtractUi"
29-
/>
29+
android:inputType="textCapWords"
30+
android:maxLines="1" />
3031

3132
<ProgressBar
3233
android:id="@+id/categoriesSearchInProgress"
34+
style="?android:progressBarStyleSmall"
3335
android:layout_width="wrap_content"
3436
android:layout_height="wrap_content"
37+
android:layout_gravity="center_vertical|end"
38+
android:layout_marginEnd="@dimen/tiny_gap"
39+
android:layout_marginRight="@dimen/tiny_gap"
3540
android:indeterminate="true"
3641
android:indeterminateOnly="true"
37-
android:layout_marginRight="@dimen/tiny_gap"
38-
android:layout_marginEnd="@dimen/tiny_gap"
39-
android:layout_gravity="center_vertical|end"
40-
style="?android:progressBarStyleSmall"
41-
android:visibility="gone"
42-
/>
42+
android:visibility="gone" />
4343
</FrameLayout>
4444

4545
<TextView
4646
android:id="@+id/categoriesNotFound"
47-
android:layout_height="wrap_content"
4847
android:layout_width="match_parent"
49-
android:visibility="gone"
48+
android:layout_height="wrap_content"
5049
android:gravity="center"
51-
/>
50+
android:visibility="gone" />
5251

5352
<TextView
5453
android:id="@+id/categoriesExplanation"
55-
android:layout_height="wrap_content"
5654
android:layout_width="match_parent"
55+
android:layout_height="wrap_content"
5756
android:layout_marginTop="@dimen/huge_gap"
58-
android:gravity="center"
5957
android:focusable="true"
58+
android:gravity="center"
6059
android:text="@string/categories_skip_explanation"
61-
android:visibility="gone"
62-
/>
60+
android:visibility="gone" />
6361

6462
<android.support.v7.widget.RecyclerView
6563
android:id="@+id/categoriesListBox"
66-
android:layout_height="wrap_content"
6764
android:layout_width="match_parent"
68-
android:fadingEdge="none"
69-
/>
65+
android:layout_height="wrap_content"
66+
android:fadingEdge="none" />
7067
</LinearLayout>

app/src/main/res/layout/fragment_multiple_uploads_list.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
android:orientation="vertical"
44
android:layout_width="match_parent"
55
android:layout_height="match_parent"
6+
android:clickable="true"
7+
android:focusableInTouchMode="true"
68
>
79

810
<EditText
@@ -23,4 +25,5 @@
2325
android:fadingEdge="none"
2426
android:fastScrollEnabled="false"
2527
/>
28+
2629
</LinearLayout>

0 commit comments

Comments
 (0)