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

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

Проектирах персонализирана клавиатура за индийски уникод език, който работи добре с изглед EditText.

Искам да прикача клавиатура с SearchView, моля, предложете налична опция за скриване на клавиатурата по подразбиране и показване на персонализирана клавиатура.

Благодаря предварително.


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


Отговори (1)


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

Променените методи са registerEditText и onKey в OnKeyBoardActionListener:

registerEditText, сега registerSearchView

    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);
    }
};

onKey

@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 във вашата дейност или фрагмент.

Но възниква нов проблем: софтуерната клавиатура по подразбиране се появява върху персонализираната клавиатура. Ако разберете как да го премахнете, моля, кажете ми! :Д

person SNB    schedule 18.03.2015