Я 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);
}
Я сохраняю входящий ViewGroup container
параметр from onCreateView
как способ доступа к токену окна для основного действия. Это выполняется без ошибок, но клавиатура не получает скрыта от вызова hideSoftInputFromWindow
в onStart
.
Изначально я пробовал использовать раздутый макет вместо container
, то есть:
imm.hideSoftInputFromWindow(myInflatedLayout.getWindowToken(), 0);
но это вызвало ошибку NullPointerException
, предположительно потому, что сам фрагмент не является действием и не имеет уникального токена окна?
Есть ли способ скрыть мягкую клавиатуру из фрагмента, или я должен создать метод в FragmentActivity
и вызвать его из фрагмента?
У меня ничего не сработало, кроме следующей строчки кода:
источник
SOFT_INPUT_STATE_HIDDEN
также работал у меня, хотя я не знаю, в чем разница между этим и 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);
источник
override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)}
Этот код работает для фрагментов:
источник
Используйте этот статический метод из любого места (Activity / Fragment), которое вам нравится.
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()))
.источник
это будет работать в моем случае, когда во вкладках я переключаюсь с одного фрагмента на другой фрагменты
@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); } } }
источник
Ничего из этого не работало с 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>
источник
Это сработало для меня в классе Kotlin
fun hideKeyboard(activity: Activity) { try { val inputManager = activity .getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager val currentFocusedView = activity.currentFocus if (currentFocusedView != null) { inputManager.hideSoftInputFromWindow(currentFocusedView.windowToken, InputMethodManager.HIDE_NOT_ALWAYS) } } catch (e: Exception) { e.printStackTrace() } }
источник
Используйте этот код в любом прослушивателе кнопки фрагмента:
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(getActivity().INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
источник
getActivity().getCurrentFocus().getWindowToken()
является ли он нулевым, иначе это вызовет ошибку, если нет сфокусированного editText. См. Мой ответ нижеКод Котлина
val imm = requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.hideSoftInputFromWindow(requireActivity().currentFocus?.windowToken, 0)
источник
Просто добавьте эту строку в свой код:
источник
В Котлине:
(activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(view?.windowToken,0)
источник
Использовать этот:
Button loginBtn = view.findViewById(R.id.loginBtn); loginBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(getActivity().INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } });
источник