FragmentActivity
を使用していくつかのフラグメントを提供するためにViewPager
を使用しています。それぞれは、次のレイアウトのListFragment
です。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent">
<LinearLayout
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:padding="8dp">
<ListView Android:id="@id/Android:list"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent" />
<EditText Android:id="@+id/entertext"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
アクティビティを開始すると、ソフトキーボードが表示されます。これを改善するために、フラグメント内で次のことを行いました。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Save the container view so we can access the window token
viewContainer = container;
//get the input method manager service
imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
. . .
}
@Override
public void onStart() {
super.onStart();
//Hide the soft keyboard
imm.hideSoftInputFromWindow(viewContainer.getWindowToken(), 0);
}
メインアクティビティのウィンドウトークンにアクセスする方法として、onCreateView
からのViewGroup container
パラメーターを保存します。これはエラーなしで実行されますが、キーボードはhideSoftInputFromWindow
のonStart
の呼び出しから隠されません。
もともと、私はcontainer
の代わりに膨張したレイアウトを使用しようとしました。つまり:
imm.hideSoftInputFromWindow(myInflatedLayout.getWindowToken(), 0);
しかし、これは、おそらくフラグメント自体がアクティビティではなく、一意のウィンドウトークンを持たないため、NullPointerException
をスローしましたか?
フラグメント内からソフトキーボードを非表示にする方法はありますか、それともFragmentActivity
にメソッドを作成し、フラグメント内から呼び出す必要がありますか?
フラグメントがビューを作成する限り、そのビューからIBinder(ウィンドウトークン)を使用できますafter添付されています。たとえば、フラグメントのonActivityCreatedをオーバーライドできます。
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
}
次のコード行だけが私のために働いた:
getActivity().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
次の属性をアクティビティのマニフェスト定義に追加すると、アクティビティが開いたときにキーボードが飛び出すのを完全に抑制します。うまくいけば、これが役立ちます:
(アクティビティのマニフェスト定義に追加):
Android:windowSoftInputMode="stateHidden"
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_my, container,
false);
someClass.onCreate(rootView);
return rootView;
}
クラスにルートビューのインスタンスを保持する
View view;
public void onCreate(View rootView) {
view = rootView;
ビューを使用してキーボードを非表示にします
public void removePhoneKeypad() {
InputMethodManager inputManager = (InputMethodManager) view
.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
IBinder binder = view.getWindowToken();
inputManager.hideSoftInputFromWindow(binder,
InputMethodManager.HIDE_NOT_ALWAYS);
}
DialogFragment
の例外は、埋め込みDialog
のフォーカスを非表示にする必要があり、代わりに埋め込みEditText
内の最初のDialog
のみを非表示にする必要があります
this.getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
このコードが機能するフラグメント
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
これは私の場合、タブであるフラグメントから別のフラグメントに切り替えるときに機能します
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
try {
InputMethodManager mImm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
mImm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
mImm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
} catch (Exception e) {
Log.e(TAG, "setUserVisibleHint: ", e);
}
}
}
好きな場所(アクティビティ/フラグメント)からこの静的メソッドを使用します。
public static void hideKeyboard(Activity activity) {
try{
InputMethodManager inputManager = (InputMethodManager) activity
.getSystemService(Context.INPUT_METHOD_SERVICE);
View currentFocusedView = activity.getCurrentFocus();
if (currentFocusedView != null) {
inputManager.hideSoftInputFromWindow(currentFocusedView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}catch (Exception e){
e.printStackTrace();
}
}
フラグメントに使用する場合は、hideKeyboard(((Activity) getActivity()))
を呼び出すだけです。
コトリンで:
(activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(view?.windowToken,0)
コードに次の行を追加するだけです。
getActivity().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
これはAPI27では機能しませんでした。これをレイアウトのコンテナに追加する必要がありました。私にとってはConstraintLayoutでした。
<Android.support.constraint.ConstraintLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:focusable="true"
Android:focusableInTouchMode="true"
Android:focusedByDefault="true">
//Your layout
</Android.support.constraint.ConstraintLayout>