2010-03-19 3 views
37

Я пытаюсь заставить 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); 
  1. Как заставить мягкую клавиатуру открытой
  2. Как я болтать все, что вводится так, что я могу справиться с каждым символом. Я хотел бы очистить каждый символ от Soft Keyboard после того, как я его обработал. т.е. пользователь не должен иметь возможность вводить целые слова в Soft Keyboard.
+0

Привет, У меня такой же вопрос, как вы. Я могу показать клавиатуру, но как я могу захватить все, что было введено без EditText? Thanx! –

ответ

13

Возможно, вам понадобится редактируемая текстовая область для фокусировки. Однако, возможно, у вас есть один невидимый или прозрачный фон без курсора. Возможно, вам придется поиграть с настройками фокусировки для представления.

Используйте TextWatcher для проверки изменений в этом EditText с помощью addTextChangedListener, или если вам нужен крючок с более низким уровнем, установите прослушиватель ключей textview с помощью метода setOnKeyListener(). См. KeyListener documentation.

Используйте этот вызов, чтобы заставить экранную клавиатуру разомкнут:

((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)) 
    .showSoftInput(myEditText, InputMethodManager.SHOW_FORCED); 

и этот, чтобы закрыть его:

((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)) 
    .hideSoftInputFromWindow(myEditText.getWindowToken(), 0); 

отмечают, что это действительно не рекомендуется - заставить клавиатуру открытой вроде беспорядочный. Каков ваш прецедент, который действительно требует вашего ввода пользователем без нормального окна редактирования и требует питания пользователя по принципу «ключ-ключ» без повторения его?

+0

Я получаю огромное количество ошибок от Droid. В частности, java.lang.IndexOutOfBoundsException: getChars (6 ... 0) имеет конец перед запуском ошибки. Это связано с EditText – jax

+0

из-за того, что EditText? И откуда эта ошибка, вызовы TextWatcher, KeyListener или showSoftInput/hideSoftInput? Вам также придется опубликовать свой код и трассировку стека, чтобы кто-нибудь мог помочь вам здесь. –

+0

Это не сработало для меня. –

121

попробовать это, чтобы заставить открытую программную клавиатуру:

((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); 
+0

Спасибо. Что такое _pay_box_helper на примере «закрытой клавиатуры»? EDIT: Я вижу, это переменная текстового поля. –

+3

Это не сработало для меня. –

+0

Отлично работает для меня, на сворачиваемом меню редактируйте текст на Action Bar Sherlock. Благодарю. – Soham

8

Чтобы заставить клавиатуру, чтобы открыть я

this.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); 

это сработало для меня.

+0

Работает для меня, но вы должны называть это до «супер».onCreate() 'in' onCreate ' – Palani

+0

это не работает для меня (API23, Google Nexus) – keinabel

5

Иногда другие ответы не будут работать.
Вот еще один способ:

Он заставит клавиатуру отображать, когда действие начинается с прослушивания фокуса окна. 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); 
      } 
     } 
    }); 

Edit: Я также видел, что клавиатура не открывать внутри вложенных фрагментов, остерегайтесь тех видов ситуаций.

1

если вы хотите управлять виртуальной клавиатурой внутри активности затем использовать этот код:

//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(); 
0
if(search.getText().toString().trim().isEmpty()) { 
    InputMethodManager imm = (InputMethodManager)getSystemService(
       Context.INPUT_METHOD_SERVICE); 
    imm.hideSoftInputFromWindow(search.getWindowToken(), 0); 
} 
+1

Пожалуйста, поясните, почему/как этот код отвечает на вопрос? Кодовые ответы не поощряются, потому что их не так легко узнать из кода с объяснением. Без объяснений требуется гораздо больше времени и усилий, чтобы понять, что делается, изменения, внесенные в код, если код отвечает на вопрос и т. Д. Объяснение важно как для людей, пытающихся извлечь уроки из ответа, так и для тех, кто оценивает ответьте, чтобы узнать, действительно ли это, или стоит голосовать. – Makyen

+0

см. Http://stackoverflow.com/help/how-to-answer – SMR

-1

Я проверил и это работает:

... // показать экранную клавиатуру

imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); 

//, чтобы скрыть его, вызовите метод снова

imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); 
+1

Плохая копия и вставка – webbi

1

К сожалению, насколько я хотел бы проголосовать за один из ответов, никто не работал для меня. Похоже, решение заключается в том, чтобы дождаться завершения фазы макета. В приведенном ниже коде обратите внимание, как я проверяю, возвращает ли метод 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; 
} 
0

ОТЛИЧНО .........

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(); 
0

Просто, используя добавление 2 линии будет работать как шарм:

При использовании XML

android:focusable="true" 
android:focusableInTouchMode="true" 

Else в Java:

view.setFocusableInTouchMode(true); 
view.requestFocus();