アクティビティ内のフラグメント内にEditTextがあります。
マイアクティビティレイアウト:
<?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>
AndroidManifest.xmlの私のアクティビティ設定:
<activity
Android:name="com.demo.LoginActivity"
Android:configChanges="orientation|keyboardHidden"
Android:launchMode="singleTop"
Android:screenOrientation="portrait"
Android:theme="@style/activityTheme" />
アクティビティでフラグメントを開始するために使用する私のコード:
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();
}
私のフラグメントのレイアウト:
<?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>
私のカスタムウィジェットLineEditView
は子クラス拡張RelativeLayout
であり、レイアウトは次のとおりです。
<?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>
EditTextのinputTypeプロパティに従ってソフトキーボードを表示し、簡単に非表示にすることができます。
私が試したが、うまくいかないか、完璧ではない:
1. フラグメントの開始時に編集テキストのキーボードを表示する によると、ソフトキーボードを表示できますが、簡単には非表示にできません(場合によっては非表示にできないこともあります)。また、EditTextのinputTypeプロパティに従っていないキーボードを表示します。
2.私のフラグメントに次のコードを追加します:
@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);
}
};
しかし、私のフラグメントではソフトキーボードをまったく表示できません。
多くのコードをリファクタリングする必要があるため、EditTextをActivityに配置できません。
誰かがこの問題を解決するアイデアを持っていますか?
これがフラグメントで非常にうまく機能する私が使用するコードです
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);
}
hideSoftKeyboard
断片的には、キーボードを非表示にしたいときにこれを呼び出す必要があります
hideSoftKeyboard(getActivity());
関数を呼び出す
private void hideSoftKeyboard(Activity activity)
{
InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
showSoftKeyboard
Edittextを渡して、framentでキーボードを表示するためにこれを呼び出します
EditText edittext=(EditText) findViewById(R.id.edittext);
showSoftKeyboard(edittext);
この関数を呼び出す
public void showSoftKeyboard(View view) {
InputMethodManager inputMethodManager = (InputMethodManager)getActivity(). getSystemService(Activity.INPUT_METHOD_SERVICE);
view.requestFocus();
inputMethodManager.showSoftInput(view, 0);
}