Android: как отобразить пользовательскую клавиатуру в SearchView?

Как отобразить пользовательское представление клавиатуры в SearchView в приложении Android?

Я разработал пользовательскую клавиатуру для индийского языка Unicode, который отлично работает с представлением EditText.

Я хочу подключить клавиатуру с SearchView, пожалуйста, предложите доступную опцию, чтобы скрыть клавиатуру по умолчанию и показать пользовательскую клавиатуру.

Заранее спасибо.


person Mayur Raiyani    schedule 08.11.2014    source источник


Ответы (1)


Если вы следовали этому руководству, необходимо внести некоторые изменения. возможность использовать SearchView в панели действий вместо EditText.

Измененные методы: registerEditText и onKey в OnKeyBoardActionListener:

зарегистрируйтеEditText, теперь зарегистрируйтеSearchView

    public void registerSearchView(SearchView searchView, final MenuItem searchMenuItem){
    SearchManager searchManager = (SearchManager) mHostActivity.getSystemService(Context.SEARCH_SERVICE);
    searchView.setSearchableInfo(searchManager.getSearchableInfo(mHostActivity.getComponentName()));
    this.searchMenuItem = searchMenuItem;
    final IBinder searchToken = searchView.getWindowToken();
    searchView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            Log.d("Focus change", "hasFocus: " + hasFocus);

            if (hasFocus) {
                showCustomKeyboard(v);
            }
            else
                hideCustomKeyboard();

        }
    });

    //The searchview clicked after the it is already in focus
    searchView.setOnClickListener(onClickListener);

    //When the searc view is clicked before it is focused
    searchView.setOnSearchClickListener(onClickListener);

    searchView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.d("Touch", event.getAction() + "");
            SearchView searchViewTemp = (SearchView) v;
            int inType = searchViewTemp.getInputType();         //backup the input type
            searchViewTemp.setInputType(InputType.TYPE_NULL);   //Disable standard keyboard
            searchViewTemp.onTouchEvent(event);
            searchViewTemp.setInputType(inType);
            return true;
        }
    });

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            searchMenuItem.collapseActionView(); //collapsing the searchview after search
            return false;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            return false;
        }
    });

    //Disable spell check
    searchView.setInputType(searchView.getInputType() | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
}

private View.OnClickListener onClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.d("onClick", v.getLayerType()+"");
        showCustomKeyboard(v);
        InputMethodManager imm = (InputMethodManager) mHostActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
    }
};

на ключе

@Override
    public void onKey(int primaryCode, int[] keyCodes) {
        View focusCurrent = mHostActivity.getWindow().getCurrentFocus();
        Class currentClass = focusCurrent.getClass();
        Class searchClass = mHostActivity.findViewById(R.id.action_line_search).getClass();
        SearchView.SearchAutoComplete sac = new SearchView.SearchAutoComplete(mHostActivity);
        Class searchAutoCompleteClass = sac.getClass();
        EditText editText = (EditText)mHostActivity.findViewById(R.id.edittext_search_lines);
        Class editTextClass = editText.getClass();

        if( focusCurrent.getClass() == SearchView.SearchAutoComplete.class) {

            SearchAutoComplete searchView = (SearchAutoComplete) focusCurrent;
            Editable editable = searchView.getText();
            int start = searchView.getSelectionStart();
            if (primaryCode == Keyboard.KEYCODE_DONE) {
                Log.d("onKey", "Search Clicked");
                mHostActivity.sendQuery(editable);
                hideCustomKeyboard();
            } else if (primaryCode == Keyboard.KEYCODE_DELETE) {
                Log.d("onKey", "Deleting input");
                if (editable != null && start > 0)
                    editable.delete(start - 1, start);
            } else {
                Log.d("onKey", "Letter or number clicked");
                editable.insert(start, Character.toString((char) primaryCode));
            }
        }
    }

Затем, когда вы хотите зарегистрировать свой SearchView, вы используете новый registerSearchView в своем действии или фрагменте.

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

person SNB    schedule 18.03.2015