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?