Не срабатывает onKey() во фрагменте

279
14 июля 2017, 03:27

Есть отдельный класс CustomKeyboard в нем описан метод onKey c некоторыми клавишами. Когда я создаю объект этого класса во фрагменте, появляется моя клавиатура, но нажатие (событие) не работает на кнопках.

public class CustomKeyboard {
private KeyboardView mKeyboardView;
private Fragment mHostFragment;
/** The key (code) handler. */
private KeyboardView.OnKeyboardActionListener mOnKeyboardActionListener = new KeyboardView.OnKeyboardActionListener() {
    public final static int CodeDelete   = -5; // Keyboard.KEYCODE_DELETE
    public final static int CodeCancel   = -3; // Keyboard.KEYCODE_CANCEL
    public final static int CodePrev     = 55000;
    public final static int CodeAllLeft  = 55001;
    public final static int CodeLeft     = 55002;
    public final static int CodeRight    = 55003;
    public final static int CodeAllRight = 55004;
    public final static int CodeNext     = 55005;
    public final static int CodeClear    = 55006;
    @Override public void onKey(int primaryCode, int[] keyCodes) {
        // NOTE We can say '<Key android:codes="49,50" ... >' in the xml file; all codes come in keyCodes, the first in this list in primaryCode
        // Get the EditText and its Editable
        View focusCurrent = mHostFragment.getActivity().getWindow().getCurrentFocus();
        if( focusCurrent==null || focusCurrent.getClass()!=EditText.class ) return;
        EditText edittext = (EditText) focusCurrent;
        Editable editable = edittext.getText();
        int start = edittext.getSelectionStart();
        // Apply the key to the edittext
        if( primaryCode==CodeCancel ) {
            hideCustomKeyboard();
        } else if( primaryCode==CodeDelete ) {
            if( editable!=null && start>0 ) editable.delete(start - 1, start);
        } else if( primaryCode==CodeClear ) {
            if( editable!=null ) editable.clear();
        } else if( primaryCode==CodeLeft ) {
            if( start>0 ) edittext.setSelection(start - 1);
        } else if( primaryCode==CodeRight ) {
            if (start < edittext.length()) edittext.setSelection(start + 1);
        } else if( primaryCode==CodeAllLeft ) {
            edittext.setSelection(0);
        } else if( primaryCode==CodeAllRight ) {
            edittext.setSelection(edittext.length());
        } else if( primaryCode==CodePrev ) {
            View focusNew= edittext.focusSearch(View.FOCUS_LEFT);
            if( focusNew!=null ) focusNew.requestFocus();
        } else if( primaryCode==CodeNext ) {
            View focusNew= edittext.focusSearch(View.FOCUS_RIGHT);
            if( focusNew!=null ) focusNew.requestFocus();
        } else { // insert character
            editable.insert(start, Character.toString((char) primaryCode));
        }
    }

    @Override public void onPress(int arg0) {
    }
    @Override public void onRelease(int primaryCode) {
    }
    @Override public void onText(CharSequence text) {
    }
    @Override public void swipeDown() {
    }
    @Override public void swipeLeft() {
    }
    @Override public void swipeRight() {
    }
    @Override public void swipeUp() {
    }
};
public CustomKeyboard(Fragment host, int viewid, int layoutid) {
    mHostFragment = host;

    mKeyboardView = (KeyboardView) host.getActivity().findViewById(viewid);
    mKeyboardView.setKeyboard(new Keyboard(host.getContext(),layoutid));
    mKeyboardView.setPreviewEnabled(false); // NOTE Do not show the preview balloons
    mKeyboardView.setOnKeyboardActionListener(mOnKeyboardActionListener);
    // Hide the standard keyboard initially
    mHostFragment.getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
/** Returns whether the CustomKeyboard is visible. */
public boolean isCustomKeyboardVisible() {
    return mKeyboardView.getVisibility() == View.VISIBLE;
}
/** Make the CustomKeyboard visible, and hide the system keyboard for view v. */
public void showCustomKeyboard( View v ) {
    mKeyboardView.setVisibility(View.VISIBLE);
    mKeyboardView.setEnabled(true);
    if( v!=null ) ((InputMethodManager)mHostFragment.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(v.getWindowToken(), 0);
}
/** Make the CustomKeyboard invisible. */
public void hideCustomKeyboard() {
    mKeyboardView.setVisibility(View.GONE);
    mKeyboardView.setEnabled(false);
}
public void registerEditText(int resid) {
    // Find the EditText 'resid'
    EditText edittext= (EditText) mHostFragment.getActivity().findViewById(resid);
    // Make the custom keyboard appear
    edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        // NOTE By setting the on focus listener, we can show the custom keyboard when the edit box gets focus, but also hide it when the edit box loses focus
        @Override public void onFocusChange(View v, boolean hasFocus) {
            if( hasFocus ) showCustomKeyboard(v); else hideCustomKeyboard();
        }
    });
    edittext.setOnClickListener(new View.OnClickListener() {
        // NOTE By setting the on click listener, we can show the custom keyboard again, by tapping on an edit box that already had focus (but that had the keyboard hidden).
        @Override public void onClick(View v) {
            showCustomKeyboard(v);
        }
    });
    // Disable standard keyboard hard way
    // NOTE There is also an easy way: 'edittext.setInputType(InputType.TYPE_NULL)' (but you will not have a cursor, and no 'edittext.setCursorVisible(true)' doesn't work )
    edittext.setOnTouchListener(new View.OnTouchListener() {
        @Override public boolean onTouch(View v, MotionEvent event) {
            EditText edittext = (EditText) v;
            int inType = edittext.getInputType();       // Backup the input type
            edittext.setInputType(InputType.TYPE_NULL); // Disable standard keyboard
            edittext.onTouchEvent(event);               // Call native handler
            edittext.setInputType(inType);              // Restore input type
            return true; // Consume touch event
        }
    });
    // Disable spell check (hex strings look like words to Android)
    edittext.setInputType(edittext.getInputType() | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
}

}

Во фрагменте, котором мне нужна клавиатура для ввода в EditText создаю объект этого класса все ок:

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    CustomKeyboard calcKeyboard = new CustomKeyboard(this, R.id.keyboardview,R.xml.custom_keyboard);
    //calcKeyboard.showCustomKeyboard(getView());
    calcKeyboard.registerEditText(R.id.expression_text);

}

Клавиатура появляется? все, ок, но не одно событие о нажатии не работает.

READ ALSO
Как изменить часть текста?

Как изменить часть текста?

Есть текст, загруженный из файла "text_inp"Нахожу в нем строку со словом "word" и читаю от конца слова до конца строки:

387
Проблема с разделителем(divider) в AnimatedExpandableListView

Проблема с разделителем(divider) в AnimatedExpandableListView

Нужно сделать разварачиваемый анимированый список я нашел вот этот код

270
Сохранять index текущей страницы

Сохранять index текущей страницы

Как можно во фрагменте сохранять его index?

322
Проблема с входом в Skype аккаунт через Skype4j

Проблема с входом в Skype аккаунт через Skype4j

Пишу бота для Skype проблем не было в процессе тестирования так как использовал свой аккаунт где логин типа "User123"Но когда зарегистрировал новый...

255