Hide Keypad when EditText out of focus (#1168)

* Hide Keypad when EditText out of focus
This commit is contained in:
Meghna Gupta 2018-02-24 00:00:45 +05:30 committed by Vivek Maskara
parent 45aab1ce76
commit 9aceaca95d
6 changed files with 120 additions and 35 deletions

View file

@ -4,6 +4,7 @@ import android.accounts.Account;
import android.accounts.AccountAuthenticatorActivity; import android.accounts.AccountAuthenticatorActivity;
import android.accounts.AccountAuthenticatorResponse; import android.accounts.AccountAuthenticatorResponse;
import android.accounts.AccountManager; import android.accounts.AccountManager;
import android.app.Activity;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
@ -17,10 +18,12 @@ import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatDelegate; import android.support.v7.app.AppCompatDelegate;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.util.Log;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.TextView; import android.widget.TextView;
@ -91,7 +94,19 @@ public class LoginActivity extends AccountAuthenticatorActivity {
ButterKnife.bind(this); ButterKnife.bind(this);
usernameEdit.addTextChangedListener(textWatcher); usernameEdit.addTextChangedListener(textWatcher);
usernameEdit.setOnFocusChangeListener((v, hasFocus) -> {
if (!hasFocus) {
hideKeyboard(v);
}
});
passwordEdit.addTextChangedListener(textWatcher); passwordEdit.addTextChangedListener(textWatcher);
passwordEdit.setOnFocusChangeListener((v, hasFocus) -> {
if (!hasFocus) {
hideKeyboard(v);
}
});
twoFactorEdit.addTextChangedListener(textWatcher); twoFactorEdit.addTextChangedListener(textWatcher);
passwordEdit.setOnEditorActionListener(newLoginInputActionListener()); passwordEdit.setOnEditorActionListener(newLoginInputActionListener());
@ -99,6 +114,13 @@ public class LoginActivity extends AccountAuthenticatorActivity {
signupButton.setOnClickListener(view -> signUp()); signupButton.setOnClickListener(view -> signUp());
} }
public void hideKeyboard(View view) {
InputMethodManager inputMethodManager =(InputMethodManager)this.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
@Override @Override
protected void onPostCreate(Bundle savedInstanceState) { protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState); super.onPostCreate(savedInstanceState);

View file

@ -1,17 +1,22 @@
package fr.free.nrw.commons.category; package fr.free.nrw.commons.category;
import android.app.Activity;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
@ -37,6 +42,7 @@ import fr.free.nrw.commons.R;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.mwapi.MediaWikiApi;
import fr.free.nrw.commons.upload.MwVolleyApi; import fr.free.nrw.commons.upload.MwVolleyApi;
import fr.free.nrw.commons.upload.SingleUploadFragment;
import fr.free.nrw.commons.utils.StringSortingUtils; import fr.free.nrw.commons.utils.StringSortingUtils;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
@ -72,6 +78,7 @@ public class CategorizationFragment extends CommonsDaggerSupportFragment {
private OnCategoriesSaveHandler onCategoriesSaveHandler; private OnCategoriesSaveHandler onCategoriesSaveHandler;
private HashMap<String, ArrayList<String>> categoriesCache; private HashMap<String, ArrayList<String>> categoriesCache;
private List<CategoryItem> selectedCategories = new ArrayList<>(); private List<CategoryItem> selectedCategories = new ArrayList<>();
private TitleTextWatcher textWatcher = new TitleTextWatcher();
private final CategoriesAdapterFactory adapterFactory = new CategoriesAdapterFactory(item -> { private final CategoriesAdapterFactory adapterFactory = new CategoriesAdapterFactory(item -> {
if (item.isSelected()) { if (item.isSelected()) {
@ -102,6 +109,15 @@ public class CategorizationFragment extends CommonsDaggerSupportFragment {
categoriesAdapter = adapterFactory.create(items); categoriesAdapter = adapterFactory.create(items);
categoriesList.setAdapter(categoriesAdapter); categoriesList.setAdapter(categoriesAdapter);
categoriesFilter.addTextChangedListener(textWatcher);
categoriesFilter.setOnFocusChangeListener((v, hasFocus) -> {
if (!hasFocus) {
hideKeyboard(v);
}
});
RxTextView.textChanges(categoriesFilter) RxTextView.textChanges(categoriesFilter)
.takeUntil(RxView.detaches(categoriesFilter)) .takeUntil(RxView.detaches(categoriesFilter))
.debounce(500, TimeUnit.MILLISECONDS) .debounce(500, TimeUnit.MILLISECONDS)
@ -110,6 +126,18 @@ public class CategorizationFragment extends CommonsDaggerSupportFragment {
return rootView; return rootView;
} }
public void hideKeyboard(View view) {
InputMethodManager inputMethodManager =(InputMethodManager)getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
@Override
public void onDestroyView() {
categoriesFilter.removeTextChangedListener(textWatcher);
super.onDestroyView();
}
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear(); menu.clear();
@ -351,4 +379,21 @@ public class CategorizationFragment extends CommonsDaggerSupportFragment {
.create() .create()
.show(); .show();
} }
private class TitleTextWatcher implements TextWatcher {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void afterTextChanged(Editable editable) {
if (getActivity() != null) {
getActivity().invalidateOptionsMenu();
}
}
}
} }

View file

@ -1,5 +1,6 @@
package fr.free.nrw.commons.upload; package fr.free.nrw.commons.upload;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.graphics.Point; import android.graphics.Point;
import android.net.Uri; import android.net.Uri;
@ -10,6 +11,7 @@ import android.text.Editable;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
@ -177,9 +179,21 @@ public class MultipleUploadListFragment extends Fragment {
photosGrid.setColumnWidth(photoSize.x); photosGrid.setColumnWidth(photoSize.x);
baseTitle.addTextChangedListener(textWatcher); baseTitle.addTextChangedListener(textWatcher);
baseTitle.setOnFocusChangeListener((v, hasFocus) -> {
if (!hasFocus) {
hideKeyboard(v);
}
});
return view; return view;
} }
public void hideKeyboard(View view) {
InputMethodManager inputMethodManager =(InputMethodManager)getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
@Override @Override
public void onDestroyView() { public void onDestroyView() {
baseTitle.removeTextChangedListener(textWatcher); baseTitle.removeTextChangedListener(textWatcher);

View file

@ -19,12 +19,16 @@
android:layout_marginRight="@dimen/standard_gap" android:layout_marginRight="@dimen/standard_gap"
android:layout_marginStart="@dimen/standard_gap" android:layout_marginStart="@dimen/standard_gap"
android:layout_marginTop="@dimen/large_gap" android:layout_marginTop="@dimen/large_gap"
android:clickable="true"
android:focusableInTouchMode="true"
app:cardCornerRadius="4dp" app:cardCornerRadius="4dp"
app:cardElevation="4dp"> app:cardElevation="4dp">
<RelativeLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:clickable="true"
android:focusableInTouchMode="true"
android:gravity="center" android:gravity="center"
android:orientation="vertical"> android:orientation="vertical">
@ -149,8 +153,8 @@
<Button <Button
android:id="@+id/signupButton" android:id="@+id/signupButton"
android:layout_width="0dp"
style="@style/Widget.AppCompat.Button.Borderless.Colored" style="@style/Widget.AppCompat.Button.Borderless.Colored"
android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_marginEnd="@dimen/small_gap" android:layout_marginEnd="@dimen/small_gap"
@ -160,8 +164,8 @@
<Button <Button
android:id="@+id/loginButton" android:id="@+id/loginButton"
android:layout_width="0dp"
style="@style/Widget.AppCompat.Button.Colored" style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/small_gap" android:layout_marginLeft="@dimen/small_gap"
android:layout_marginStart="@dimen/small_gap" android:layout_marginStart="@dimen/small_gap"
@ -188,19 +192,19 @@
<android.support.v7.widget.AppCompatImageView <android.support.v7.widget.AppCompatImageView
android:layout_width="64dp" android:layout_width="64dp"
android:layout_height="64dp" android:layout_height="64dp"
android:elevation="8dp"
tools:ignore="UnusedAttribute"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
app:srcCompat="@drawable/blue_rinse_circle" /> android:elevation="8dp"
app:srcCompat="@drawable/blue_rinse_circle"
tools:ignore="UnusedAttribute" />
<android.support.v7.widget.AppCompatImageView <android.support.v7.widget.AppCompatImageView
android:layout_width="42dp" android:layout_width="42dp"
android:layout_height="42dp" android:layout_height="42dp"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
tools:ignore="UnusedAttribute"
android:elevation="8dp" android:elevation="8dp"
app:srcCompat="@drawable/commons_logo_large" /> app:srcCompat="@drawable/commons_logo_large"
tools:ignore="UnusedAttribute" />
</FrameLayout> </FrameLayout>

View file

@ -1,70 +1,67 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?attr/fragmentCategorisationBackground" android:background="?attr/fragmentCategorisationBackground"
android:clickable="true"
android:focusableInTouchMode="true"
android:orientation="vertical"
android:paddingBottom="@dimen/small_gap" android:paddingBottom="@dimen/small_gap"
android:paddingLeft="@dimen/standard_gap"
android:paddingStart="@dimen/standard_gap"
android:paddingRight="@dimen/standard_gap"
android:paddingEnd="@dimen/standard_gap" android:paddingEnd="@dimen/standard_gap"
android:paddingLeft="@dimen/standard_gap"
android:paddingRight="@dimen/standard_gap"
android:paddingStart="@dimen/standard_gap"
android:paddingTop="@dimen/small_gap" android:paddingTop="@dimen/small_gap"
android:theme="@style/DarkAppTheme" android:theme="@style/DarkAppTheme">
>
<FrameLayout <FrameLayout
android:layout_height="wrap_content"
android:layout_width="match_parent" android:layout_width="match_parent"
> android:layout_height="wrap_content"
android:clickable="true"
android:focusableInTouchMode="true">
<EditText <EditText
android:id="@+id/categoriesSearchBox" android:id="@+id/categoriesSearchBox"
android:layout_height="wrap_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/categories_search_text_hint" android:hint="@string/categories_search_text_hint"
android:maxLines="1"
android:inputType="textCapWords"
android:imeOptions="flagNoExtractUi" android:imeOptions="flagNoExtractUi"
/> android:inputType="textCapWords"
android:maxLines="1" />
<ProgressBar <ProgressBar
android:id="@+id/categoriesSearchInProgress" android:id="@+id/categoriesSearchInProgress"
style="?android:progressBarStyleSmall"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="@dimen/tiny_gap"
android:layout_marginRight="@dimen/tiny_gap"
android:indeterminate="true" android:indeterminate="true"
android:indeterminateOnly="true" android:indeterminateOnly="true"
android:layout_marginRight="@dimen/tiny_gap" android:visibility="gone" />
android:layout_marginEnd="@dimen/tiny_gap"
android:layout_gravity="center_vertical|end"
style="?android:progressBarStyleSmall"
android:visibility="gone"
/>
</FrameLayout> </FrameLayout>
<TextView <TextView
android:id="@+id/categoriesNotFound" android:id="@+id/categoriesNotFound"
android:layout_height="wrap_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:visibility="gone" android:layout_height="wrap_content"
android:gravity="center" android:gravity="center"
/> android:visibility="gone" />
<TextView <TextView
android:id="@+id/categoriesExplanation" android:id="@+id/categoriesExplanation"
android:layout_height="wrap_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/huge_gap" android:layout_marginTop="@dimen/huge_gap"
android:gravity="center"
android:focusable="true" android:focusable="true"
android:gravity="center"
android:text="@string/categories_skip_explanation" android:text="@string/categories_skip_explanation"
android:visibility="gone" android:visibility="gone" />
/>
<android.support.v7.widget.RecyclerView <android.support.v7.widget.RecyclerView
android:id="@+id/categoriesListBox" android:id="@+id/categoriesListBox"
android:layout_height="wrap_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:fadingEdge="none" android:layout_height="wrap_content"
/> android:fadingEdge="none" />
</LinearLayout> </LinearLayout>

View file

@ -3,6 +3,8 @@
android:orientation="vertical" android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:clickable="true"
android:focusableInTouchMode="true"
> >
<EditText <EditText
@ -23,4 +25,5 @@
android:fadingEdge="none" android:fadingEdge="none"
android:fastScrollEnabled="false" android:fastScrollEnabled="false"
/> />
</LinearLayout> </LinearLayout>