How to perfectly show soft keyboard in fragment on Android?

I have an EditText inside a fragment inside an Activity.

My Activity layout:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/login_bg"> ... <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent"/> ... </RelativeLayout> 

My Activity config in AndroidManifest.xml:

  <activity android:name="com.demo.LoginActivity" android:configChanges="orientation|keyboardHidden" android:launchMode="singleTop" android:screenOrientation="portrait" android:theme="@style/activityTheme" /> 

My code that is used to run the fragment in Activity:

 private void startFragment(BaseFragment fragment, String tag) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTransaction.addToBackStack(tag); fragmentTransaction.commitAllowingStateLoss(); } 

My snippet:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/common_background_color_white" android:orientation="vertical" android:clickable="true" android:paddingLeft="@dimen/email_common_padding_horizontal" android:paddingRight="@dimen/email_common_padding_horizontal"> ... <com.example.widget.LineEditView android:id="@+id/login_email_input" style="@style/BaseEditText.LoginEditText" android:layout_width="match_parent" android:layout_height="wrap_content" android:focusable="true" /> ... </LinearLayout> 

My Custom Widget LineEditView is a child of the extend RelativeLayout class, and its layout is:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/input" android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/edit" android:layout_width="match_parent" android:layout_height="wrap_content" android:focusable="true" android:gravity="start|center_vertical" android:background="@android:color/transparent" android:textColor="@color/common_text_color_black" android:maxLines="1" android:textCursorDrawable="@drawable/common_cursor_background_orange" android:textSize="@dimen/email_fields_text_size" android:paddingBottom="@dimen/email_fields_text_padding_bottom"/> <View android:id="@+id/underline" android:layout_below="@id/edit" android:layout_width="match_parent" android:layout_height="2px"/> </RelativeLayout> 

I want to show a soft keyboard according to the inputType EditText property and easily hide it.

What I tried but not working or not perfect:

1. According to the Show keyboard for edittext, when a fragment is launched, it can display a soft keyboard, but cannot hide easily (sometimes it can’t be hidden), and it shows the keyboard not in accordance with the inputType property of the EditText.

2. I will add the following code to My Fragment:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container) { mEditText = (EditText) rootView.findViewById(R.id.edit); mEditText.requestFocus(); mEditText.setFocusable(true); } @Override public void onResume() { mEditText.postDelayed(mShowSoftInputRunnable, 400); super.onResume(); } private Runnable mShowSoftInputRunnable = new Runnable() { @Override public void run() { FragmentActivity activity = getActivity(); if (activity == null) return; InputMethodManager input = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); input.showSoftInput(mEditText, InputMethodManager.SHOW_IMPLICIT); } }; 

but it cannot display a soft keyboard at all in my fragment.

I cannot put an EditText in an Activity because it needs to refactor a lot of code.

Does anyone have any ideas to solve these problems?

+6
source share
2 answers

Here is the code I'm using that works fine in Snippets

 public static void hideKeyboard(Context context) { try { ((Activity) context).getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); if ((((Activity) context).getCurrentFocus() != null) && (((Activity) context).getCurrentFocus().getWindowToken() != null)) { ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(((Activity) context).getCurrentFocus().getWindowToken(), 0); } } catch (Exception e) { e.printStackTrace(); } } public static void showKeyboard(Context context) { ((InputMethodManager) (context).getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); } 
+16
source

hideSoftKeyboard

In a snippet you need to call this when you want to hide the keyboard

 hideSoftKeyboard(getActivity()); 

Call function

  private void hideSoftKeyboard(Activity activity) { InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0); } 

showSoftKeyboard

You call this for the show keyboard in a frame with an edittext pass

  EditText edittext=(EditText) findViewById(R.id.edittext); showSoftKeyboard(edittext); 

call this function

  public void showSoftKeyboard(View view) { InputMethodManager inputMethodManager = (InputMethodManager)getActivity(). getSystemService(Activity.INPUT_METHOD_SERVICE); view.requestFocus(); inputMethodManager.showSoftInput(view, 0); } 
+2
source

All Articles