2015-11-30 5 views
1

Я разрабатываю пользовательскую клавиатуру для Android, и я испытываю какое-то странное поведение при смене клавиатуры ... На первом запуске (либо после сборки из Android Studio, либо через Ткань), клавиатура не будет рядом, когда я использую:Android-клавиатура не закрыта

InputMethodManager imeManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE); 
imeManager.switchToNextInputMethod(getToken(), false /* onlyCurrentIme */); 

Он будет открыт следующим метод ввода за мою клавиатуру ... Но моя клавиатура будет навязана сверху другой клавиатура ... Это даже останется там, если вы перейдете на главный экран ... Но как только устройство было перезапущено, клавиатура меняется без каких-либо проблем ... Я читал об этом, и я видел, что там было некоторые проблемы с клавиатурами в предыдущих версиях Android, есть ли еще?

Ниже приводится соответствующий код:

public class CustomKeyboard extends InputMethodService implements KeyboardView.OnKeyboardActionListener { 

    private KeyboardView kv; 
    private Keyboard keyboard; 

    public final static int CodeRowFourGlobe = 55041; 

    @Override 
    public View onCreateInputView() { 
     kv = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null); 
     keyboard = new Keyboard(this, R.xml.custom_keyboard); 
     kv.setPreviewEnabled(false); 
     kv.setKeyboard(keyboard); 
     kv.setOnKeyboardActionListener(this); 
     return kv; 
    } 

    private IBinder getToken() { 
     final Dialog dialog = getWindow(); 
     if (dialog == null) { 
      return null; 
     } 
     final Window window = dialog.getWindow(); 
     if (window == null) { 
      return null; 
     } 
     return window.getAttributes().token; 
    } 

    @Override 
    public void onPress(int primaryCode) { 

    } 

    @Override 
    public void onRelease(int primaryCode) { 

    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    @Override 
    public void onKey(int primaryCode, int[] keyCodes) { 
     InputConnection ic = getCurrentInputConnection(); 

     if (primaryCode == Keyboard.KEYCODE_DELETE) { 
      ic.deleteSurroundingText(1, 0); 
     } else if (primaryCode == CodeRowFourGlobe) { 
      InputMethodManager imeManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE); 
      imeManager.switchToNextInputMethod(getToken(), false /* onlyCurrentIme */); 
     } else { 
      /* not relevant */ 
     } 
    } 

    @Override 
    public void onText(CharSequence text) { 

    } 

    @Override 
    public void swipeLeft() { 

    } 

    @Override 
    public void swipeRight() { 

    } 

    @Override 
    public void swipeDown() { 

    } 

    @Override 
    public void swipeUp() { 

    } 
} 

У вас есть какие-либо идеи, если это проблема с тем, как я меняю клавиатуру или известный Android вопрос?

+0

см. Мой ответ .... –

+0

Вы каждый раз воссоздаете экземпляр 'InputMethodManager' в вашем методе onKey(). Лучше создать экземпляр класса на вашем 'onCreate()'. –

ответ

1

попробовать это работает для меня в любое время

public static void hideKeyboard(Context context) { 

try { 
InputMethodManager inputManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 

View view = ((Activity) context).getCurrentFocus(); 
if (view != null) { 
inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 
} 
} catch (Exception e) { 
e.printStackTrace(); 
} 


} 
+0

Как вы бы хотели его использовать? Я не могу назвать это «этим», так как мой класс не может быть перенесен на ацитацию. – user969043

+0

это метод .. и называть этот метод hideKeyboard (youractivity.this) или использовать getApplicatioContext..whereever, пытающийся скрыть клавиатуру –

+0

dont использовать в этом классе .. использовать в деятельности или фрагменте .. прямо –

0

Видимость IME обрабатывается самой системой.

Я столкнулся с аналогичной проблемой несколько дней назад и исправил ее, снова закодировав IME &, занимаясь все время в фоновом потоке (например, getTextBeforeCursor()/getTextAfterCursor, чтение/запись локальной базы данных и т. Д.). ,

Если вы переключаетесь с/на другой IME более одного раза, и то же самое происходит, то это проблема, о которой я говорю.

Так что, возможно, вы вызываете что-то, что требует времени или застревает IME. Просто обратитесь к документации о вызовах, которые вы делаете, чтобы проверить, не принимают ли они неопределенное время.

Надеюсь, это поможет.

Смежные вопросы