Выключение мягкой клавиатуры
Я пытаюсь заставить Soft Keyboard открыть в Activity и захватить все, что введено, так как я хочу сам обрабатывать вход, у меня нет EditText. В настоящее время я пробовал это, но он не работает. Я бы хотел, чтобы Soft Keyboard открылась ниже mAnswerTextView (Примечание: это TextView not EditText).
InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
// only will trigger it if no physical keyboard is open
mgr.showSoftInput(mAnswerTextView, InputMethodManager.SHOW_IMPLICIT);
- Как заставить открывать Soft Keyboard
- Как убрать все введенное, чтобы я мог обрабатывать каждый символ. Я хотел бы очистить каждый символ от Soft Keyboard после того, как я его обработал. т.е. пользователь не должен иметь возможность вводить целые слова в Soft Keyboard.
Ответы
Ответ 1
попробуйте это, чтобы заставить открытую мягкую клавиатуру:
((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
то вы можете использовать этот код для закрытия клавиатуры:
((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(_pay_box_helper.getWindowToken(), 0);
Ответ 2
Вероятно, вам нужно иметь редактируемую текстовую область для фокусировки. Однако, возможно, у вас есть один невидимый или прозрачный фон без курсора. Возможно, вам придется поиграть с настройками фокусировки для представления.
Используйте TextWatcher для проверки изменений в этом EditText с addTextChangedListener, или если вам нужен крючок с более низким уровнем, установите прослушиватель ключевых слов textview с помощью метода setOnKeyListener(). См. Документация KeyListener.
Используйте этот вызов, чтобы открыть мягкую клавиатуру:
((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE))
.showSoftInput(myEditText, InputMethodManager.SHOW_FORCED);
и этот, чтобы закрыть его:
((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE))
.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
Обратите внимание, что это действительно не рекомендуется - принудительное открытие клавиатуры является довольно грязным. Каков ваш прецедент, который действительно требует вашего ввода пользователем без нормального поля редактирования и требует питания пользователя по принципу "ключ за ключ" без повторения его?
Ответ 3
Чтобы заставить клавиатуру открыться, я использовал
this.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
это сработало для меня.
Ответ 4
Иногда другие ответы не будут работать.
Вот еще один способ.
Это заставит клавиатуру отображать, когда действие начинается с прослушивания фокуса окна. onWindowFocusChanged()
он очистится и запросит фокус EditText, затем установите режим мягкого ввода на видимый и установите выделение в текст в поле. Это всегда должно работать, если вы вызываете его из действия.
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
mEditText.clearFocus();
mEditText.requestFocus();
getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
mEditText.setSelection(mEditText.getText().toString().length());
}
}
Вам также может понадобиться
mEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mEditText, InputMethodManager.SHOW_IMPLICIT);
}
}
});
Изменить: Я также видел, что клавиатура не открыта внутри вложенных фрагментов, остерегайтесь таких ситуаций.
Ответ 5
если вы хотите управлять мягкой клавиатурой внутри действия, используйте этот код:
//create soft keyboard object
InputMethodManager imm = (InputMethodManager)this.getSystemService(INPUT_METHOD_SERVICE);
//1.USE
your_view.setFocusableInTouchMode(true); //Enable touch soft keyboard to this view
//or
your_view.setFocusable(true); //Enable keyboard to this view
imm.showInputMethod(your_view, InputMethodManager.SHOW_IMPLICIT);
//2.USE show keyboard if is hidden or hide if it is shown
imm.toggleSoftInputFromWindow(your_view.getWindowToken(),InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_IMPLICIT_ONLY);
//or
imm.toggleSoftInputFromWindow(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_IMPLICIT_ONLY);
//3.USE (you cannot control imm)
this.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
//4.USE (with Dialog)
Dialog d = new Dialog(this, android.R.style.Theme_Panel);
d.getWindow().setTitle(null);
d.setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
d.setOnKeyListener(keyListener);
d.setCanceledOnTouchOutside(true);
d.setCancelable(true);
d.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
d.show();
//to hide keyboard call:
d.dismiss();
//if you want get soft keyboard visibility call:
d.isShowing();
Ответ 6
К сожалению, насколько мне хотелось бы проголосовать за один из ответов, никто не работал у меня. Похоже, решение заключается в том, чтобы дождаться завершения фазы макета. В приведенном ниже коде обратите внимание, как я проверяю, возвращает ли метод showKeyboard
TRUE, и когда я удаляю глобальный приемник макетов. Не делая этого, он попал и промахнулся. Теперь это работает отлично.
Вам нужно сделать ниже идеально в onResume()
@Override
public void onResume()
{
super.onResume();
ViewTreeObserver vto = txtTaskTitle.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
{
@Override
public void onGlobalLayout()
{
if (txtTaskTitle.requestFocus())
{
if (showKeyboard(getContext(), txtTaskTitle))
{
txtTaskTitle.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
}
}
});
}
public static boolean showKeyboard(Context context, EditText target)
{
if (context == null || target == null)
{
return false;
}
InputMethodManager imm = getInputMethodManager(context);
((InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(target, InputMethodManager.SHOW_FORCED);
boolean didShowKeyboard = imm.showSoftInput(target, InputMethodManager.SHOW_FORCED);
if (!didShowKeyboard)
{
didShowKeyboard = ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(target, InputMethodManager.SHOW_FORCED);
}
return didShowKeyboard;
}
Ответ 7
if(search.getText().toString().trim().isEmpty()) {
InputMethodManager imm = (InputMethodManager)getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(search.getWindowToken(), 0);
}
Ответ 8
Я тестировал и это работает:
...
// показать мягкую клавиатуру
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
//, чтобы скрыть его, снова вызовите метод
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Ответ 9
Работает отлично.........
edt_searchfilter_searchtext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus){
edt_searchfilter_searchtext.post(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager) getFragmentActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(edt_searchfilter_searchtext, InputMethodManager.SHOW_IMPLICIT);
}
});
}
}
});
Ниже строки, когда вы хотите открыть клавиатуру
edt_searchfilter_searchtext.requestFocus();
Ответ 10
Просто, используя добавление 2 строк, будет работать как шарм:
Если вы используете XML
android:focusable="true"
android:focusableInTouchMode="true"
Else в Java:
view.setFocusableInTouchMode(true);
view.requestFocus();
Ответ 11
Для пользователя kotlin
Весь кредит идет на ответ дмитрия
Откройте клавиатуру во фрагменте.
Я передал переменную mainActivity
в fragment
constructor
согласно моему требованию, возможно, этот хак/патч не рекомендуется согласно AndroidGuidLines
(ну, я не знаю).
Но здесь мы идем...
@SuppressLint("ValidFragment")
class MyDemoFragment(private val mainActivity: MainActivity) : Fragment() {
// EditText declaration
private lateinit var etMyEditText: EditText
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
val view = inflater.inflate(R.layout.fragment_my_demo, container, false)
// EditText initialisation
etMyEditText = view.findViewById(R.id.etMyEditText)
// This line will open KeyBoard
(mainActivity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
// Requesting cursor focus
etMyEditText.requestFocus()
return view
}
}
Ответ 12
Вы можете использовать этот класс KeyboardHelper.java
import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
/**
* Created by khanhamza on 06-Mar-17.
*/
public class KeyboardHelper {
public static void hideSoftKeyboard(Context context, View view) {
if (context == null || view == null) {
return;
}
InputMethodManager imm = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
public static void hideSoftKeyboardForced(Context context, View view) {
if (context == null) {
return;
}
InputMethodManager imm = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromInputMethod(view.getWindowToken(), 0);
}
public static void hideSoftKeyboard(Context context, EditText editText) {
if (context == null) {
return;
}
InputMethodManager imm = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);
}
public static void showSoftKeyboard(Context context, EditText editText) {
if (context == null) {
return;
}
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
editText.requestFocus();
}
public static void showSoftKeyboardForcefully(Context context, EditText editText) {
if (context == null) {
return;
}
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
editText.requestFocus();
}
}