web-dev-qa-db-ja.com

Androidでソフトキーボードを断片的に完全に表示するにはどうすればよいですか?

アクティビティ内のフラグメント内に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に配置できません。

誰かがこの問題を解決するアイデアを持っていますか?

9
Waylent

これがフラグメントで非常にうまく機能する私が使用するコードです

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);
}
34
apmartin1991

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);
}
5
Arjun saini