2016-08-24 3 views
1

Привета я использовал SearchView, как показано ниже,Как сохранить мягкое состояние клавиатуры после invalidateOptionsMenu андроида

@Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     menu.clear(); 
     inflater.inflate(R.menu.all_menu, menu); 
     SearchManager manager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE); 
     SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); 
     searchView.setSearchableInfo(manager.getSearchableInfo(getActivity().getComponentName())); 
     searchTextView = (AutoCompleteTextView) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text); 
     try { 
      Field mCursorDrawableRes = TextView.class.getDeclaredField("mCursorDrawableRes"); 
      mCursorDrawableRes.setAccessible(true); 
      mCursorDrawableRes.set(searchTextView, R.drawable.cursor); //This sets the cursor resource ID to 0 or @null which will make it visible on white background 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     if (searchView != null) { 
      searchView.setQueryHint(getString(R.string.search)); 
      searchView.setOnQueryTextListener(this); 
     } 
     mMenu = menu; 
     setNotificationCount(mMenu); 
    } 

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

getSupportActionBar().invalidateOptionsMenu(); 

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

KeyboardVisibilityEvent.setEventListener(getActivity(), new KeyboardVisibilityEventListener() { 
         @Override 
         public void onVisibilityChanged(boolean isOpen) { 
          if(!isFristTime){ 
           Log.d("ss","keyboard status before validated "+isKeyboardOpened); 
           isKeyboardOpened = isOpen; 
           isFristTime = true; 
          } 
         } 
        }); 
        getSupportActionBar().invalidateOptionsMenu(); 
        Log.d("ss","keyboard status after validated "+isKeyboardOpened); 
        if(isKeyboardOpened){ 
         final Handler handler = new Handler(); 
         handler.postDelayed(new Runnable() { 
          @Override 
          public void run() { 
           try { 
            Log.d("ss","keyboard status in try "); 
            Field mCursorDrawableRes = TextView.class.getDeclaredField("mCursorDrawableRes"); 
            mCursorDrawableRes.setAccessible(true); 
            mCursorDrawableRes.set(searchTextView, R.drawable.cursor); //This sets the cursor resource ID to 0 or @null which will make it visible on white background 
            BDevice.showSoftKeyboard(getActivity(), searchTextView); 
            isKeyboardOpened = false; 
            getSupportActionBar().invalidateOptionsMenu(); 
           } catch (Exception e) { 
            Log.d("ss","keyboard status in catch "); 
            e.printStackTrace(); 
           } 
          } 
         }, 1000); 
        } 

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

ответ

0

Я нашел решение. Всякий раз, когда проверка меню панели действий onCreateOptionsMenu получает вызов. Поэтому я сначала храню состояние клавиатуры, когда клавиатура открывается и проверяет состояние клавиатуры в onCreateOptionsMenu после ее проверки. Затем я использую, чтобы расширить SearchView и открыть экранную клавиатуру программным способом, как показано ниже,

Глобальные переменные

private boolean isFristTime = false, isKeyboardOpened = false; 
private String mCurrentQuery = ""; 

Тогда мой код в методе onCreateOptionsMenu

if(isKeyboardOpened) { 
       searchView.setIconified(false); 
       searchItem.expandActionView(); 
       searchView.requestFocus(); 
       if(!TextUtils.isEmpty(mCurrentQuery)){ 
        searchView.setQuery(mCurrentQuery, false); 
       }else{ 
        searchView.setQueryHint(getString(R.string.search)); 
       } 
       searchView.setIconifiedByDefault(true); 
       BDevice.showSoftKeyboard(getActivity(), searchTextView); 
       isKeyboardOpened = false; 
      } 

и я получаю мой старт клавиатуры перед валидацией, как показано ниже,

KeyboardVisibilityEvent.setEventListener(getActivity(), new KeyboardVisibilityEventListener() { 
         @Override 
         public void onVisibilityChanged(boolean isOpen) { 
          if(!isFristTime){ 

           isKeyboardOpened = isOpen; 
           isFristTime = true; 
          } 
         } 
        }); 

        getSupportActionBar().invalidateOptionsMenu(); 

и получения моего запроса внутри метод onQueryTextChange

@Override 
     public boolean onQueryTextChange(String newText) { 
      mCurrentQuery = newText; 
      return true; 
     } 

Счастливый Coding ...

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

  • Нет связанных вопросов^_^