2014-03-31 113 views
0

我遇到了一些問題,試圖檢測軟件鍵盤是否可見。當鍵盤可見或隱藏不工作時檢測

我尋找一個解決方案(包括SO),但沒有運氣。 什麼奇怪的是,我這樣做是在相同的應用程序通過檢查窗口的大小發生了變化,就像這樣:

final View activityRootView = findViewById(R.id.tlFull); 
//tlFull is the activity table layout 
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() 
{ 
    public void onGlobalLayout() 
    { 
     int heightDiff = activityRootView.getRootView() 
       .getHeight() - activityRootView.getHeight(); 
     if (heightDiff > 100) 
     { 
      //did some stuff here 
     } 
     else 
     { 
      //and here 
     } 
    } 
}); 

,並通過添加 的android:manifest文件windowSoftInputMode =「adjustResize」。

現在我正在嘗試在登錄活動上做同樣的事情,但它由於某種原因而接縫,因爲heightDiff總是38,所以這不再起作用。對於使用相同方法的SO上找到的每個方法也是如此。

我也試過這個,但它總是返回true。

final View activityRootView = findViewById(R.id.tlFull); 
activityRootView.getViewTreeObserver() 
     .addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
{ 
     @Override 
     public void onGlobalLayout() 
     { 
      if (getResources().getConfiguration() 
          .keyboardHidden == Configuration.KEYBOARDHIDDEN_NO) 
      {} 
      else 
      {} 
     } 
}); 

而且,由於我沒有使用片段,我不能用這個:

InputMethodManager imm = (InputMethodManager) getActivity() 
      .getSystemService(Context.INPUT_METHOD_SERVICE); 

if (imm.isAcceptingText()) 
{} 
else 
{} 

我也嘗試了不同的方法。 我做我想做的etPass(觸發鍵盤編輯文本)的onClick方法做:

etPass.setOnClickListener(new OnClickListener() 
{ 
    public void onClick(View viewIn) 
    { 
    ivImageView.setVisibility(View.GONE); 
    } 
}); 

不幸的是,即使鍵盤顯示出來的圖像視圖並不總是在第一次輕觸消失,所以我必須再次點擊。

第二個問題是我試圖再次在onBackPressed()方法中顯示iv。這有效,但不是它應該如何。

當我第一次點擊後退按鈕時,鍵盤消失了,但我必須再次點擊以使圖像可見。 (我試過在這裏提供的解決方案,但它沒有工作:EditText with soft keyboard and "Back" button

此外,這可以防止關閉onBackPressed()應用程序。

關於如何解決這個問題以及爲什麼差異總是相同的任何想法? 我找不到一個更好的解決方案,現在我擔心未來可能會出現同樣的問題(儘管它在接下來的測試中能夠正常工作)

+0

試試這個辦法,工作可靠我:http://stackoverflow.com/questions/4745988/how-do-i-detect-if-software-keyboard- is-visible-on-android-device/31090451#31090451 –

回答

2

您只是使用此方法來感知在應用程序的配置更改....

@Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 

     // Checks whether a hardware keyboard is available 
     if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) { 

     } else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) { 

     } 
    } 
+0

謝謝。但是,onConfigurationChanged()不會被調用。我還在androidmanifest的登錄活動下添加了android:configChanges =「orientation | keyboardHidden | screenSize」,但沒有運氣。 – daydr3am3r

+0

LE:它接縫setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)阻止onConfigurationChanged()被調用。我刪除它,它只是在活動開始時調用方法。 – daydr3am3r

+0

你會試試這個鏈接我希望它對你有用..... http://stackoverflow.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android –