2016-08-24 25 views
1

您好我已經使用搜索查看類似下面的軟鍵盤狀態,如何留住後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中的鍵盤狀態。然後,我用它來擴大搜索查看和編程方式打開軟鍵盤類似下面,

全局變量

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

編碼快樂...