Ответ 1
Это работает?
imgr.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
Когда начнется мой фрагмент, я хочу, чтобы мой edittext был в фокусе/позволил пользователю просто начать вводить его. Я могу сосредоточиться на requestFocus(), но я не могу заставить клавиатуру отобразиться.
Я пробовал оба:
edit = (EditText) view.findViewById(R.id.search);
edit.requestFocus();
InputMethodManager imgr = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imgr.showSoftInput(edit, 0);
и
edit = (EditText) view.findViewById(R.id.search);
InputMethodManager imgr = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imgr.showSoftInput(edit, 0);
edit.requestFocus();
Как я могу заставить клавиатуру отобразиться для EditText?
Это работает?
imgr.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
Вы можете попробовать это
@Override
public void onResume() {
super.onResume();
edit.post(new Runnable() {
@Override
public void run() {
edit.requestFocus();
InputMethodManager imgr = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imgr.showSoftInput(edit, InputMethodManager.SHOW_IMPLICIT);
}
});
}
Так как использование showSoftInput
не работает для всех случаев и после попытки использования некоторых из упомянутых здесь решений, например:
if (binding.account.requestFocus()) {
getActivity().getWindow()
.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
}
Я, наконец, сделал это с помощью:
if (binding.account.requestFocus()) {
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(
InputMethodManager.SHOW_FORCED,
InputMethodManager.HIDE_IMPLICIT_ONLY
);
}
С
binding.account.requestFocus()
запрашивает фокус только для EditText
(он не открывает клавиатуру)
и
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(
InputMethodManager.SHOW_FORCED,
InputMethodManager.HIDE_IMPLICIT_ONLY
);
- единственное решение, которое работает правильно, чтобы показать клавиатуру (и самую проголосовавшую)
Удачи!: -)
У меня есть полезное расширение для этого:
fun EditText.showKeyboard() {
if (requestFocus()) {
(getActivity()?.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager)
.showSoftInput(this, SHOW_IMPLICIT)
setSelection(text.length)
}
}
Вам также понадобится это:
fun View.getActivity(): AppCompatActivity?{
var context = this.context
while (context is ContextWrapper) {
if (context is AppCompatActivity) {
return context
}
context = context.baseContext
}
return null
}
@Override
public void onHiddenChanged (boolean hidden)
{
super.onHiddenChanged(hidden);
if(hidden)
{
hideKeyboard(yourView);
}
else
{
toggleKeyboard(yourView);
}
}
public static void toggleKeyboard(View v)
{
InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
v.requestFocus();
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_NOT_ALWAYS);
}
public static void hideKeyboard(View v)
{
InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
Другой способ открыть клавиатуру при запуске фрагмента - вызвать requestFocus()
в onCreateView
и соответственно отреагировать, открыв клавиатуру тогда и только тогда, когда EditText
будет сфокусирован.
if(this.editText.requestFocus())
{
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
}
Перепробовав все решения здесь и по другим связанным вопросам, вот метод, который работает для меня:
editText.postDelayed(Runnable { showKeyboard(activity, editText)} , 50)
fun showKeyboard(activity: Activity, editText: EditText) {
val inputMethodManager = activity.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
editText.requestFocus()
inputMethodManager.showSoftInput(this, 0)
}
Интересный факт: когда вы вызываете его без postDeleayed, он не будет работать, даже если вы просто задержите его на 1 миллисекунду, он все равно не будет работать: D
Вы также можете использовать его как расширение:
fun EditText.showKeyboard(activity: Activity) {
val inputMethodManager = activity.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
requestFocus()
inputMethodManager.showSoftInput(this, 0)
}
если вам не нравится передавать активность в качестве параметра, вы используете эту функцию расширения, как подсказывает @Rafols:
fun View.getActivity(): AppCompatActivity? {
var context = this.context
while (context is ContextWrapper) {
if (context is AppCompatActivity) {
return context
}
context = context.baseContext
}
return null
}
тогда ваш метод будет выглядеть так:
fun EditText.showKeyboard() {
val inputMethodManager = getActivity()!!.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
requestFocus()
inputMethodManager.showSoftInput(this, 0)
}
также, если у вас уже есть текст в вашем EditText, его лучше выбрать в конце вашего существующего текста:
fun EditText.showKeyboard() {
val inputMethodManager = getActivity()!!.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
requestFocus()
inputMethodManager.showSoftInput(this, 0)
setSelection(length())
}
и если вы хотите запустить его при запуске фрагмента:
override fun onResume() {
super.onResume()
editText.postDelayed(Runnable { editText.showKeyboard()} , 50)
}
Как сказал Нилзор, это работает
imgr.showSoftInput(getView(), InputMethodManager.SHOW_IMPLICIT)
и я согласен, что это лучшее решение, чем toogleSoftInput
эта статья помогла мне
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_edit_name, container);
editText = (EditText) view.findViewById(R.id.txt_yourName);
editText.requestFocus();
getDialog().getWindow().setSoftInputMode(
LayoutParams.SOFT_INPUT_STATE_VISIBLE);
return view;
}
Просто, используя добавление 2 строк, будет работать как шарм:
Если вы используете XML
android:focusable="true"
android:focusableInTouchMode="true"
Else в Java:
view.setFocusableInTouchMode(true);
view.requestFocus();