2012-11-23 77 views
25

有沒有辦法知道屏幕上顯示的鍵盤的尺寸?獲取軟鍵盤的尺寸

我正在使用Cocos2dx進行編程,但我想知道Android或Coco部分屏幕中顯示的鍵盤高度,這並不重要。

我知道鍵盤有一個getHeight()方法,但我不想創建新的鍵盤,我想使用默認的鍵盤。

+0

檢查出這個...的http:// stackoverflow.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android –

+0

你想要鍵盤嗎?然後cocos2d-x已經包含了你可以在Test Classes - > TextInput中檢查的android keyBoard他們在cocos2d-x中使用android鍵盤...檢查它是否可以幫助您 – user1201239

+0

謝謝我會檢查 –

回答

32

我們做到了這個

myLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 

       @Override 
       public void onGlobalLayout() { 
        // TODO Auto-generated method stub 
        Rect r = new Rect(); 
        parent.getWindowVisibleDisplayFrame(r); 

        int screenHeight = parent.getRootView().getHeight(); 
        int heightDifference = screenHeight - (r.bottom - r.top); 
        Log.d("Keyboard Size", "Size: " + heightDifference); 

        //boolean visible = heightDiff > screenHeight/3; 
       } 
      }); 

我們只調整與鍵盤的意見,所以我們可以利用這一點。

+1

,但它顯然不是一個通用的解決方案。 – Jacky

+0

px或dp的高度差是多少? –

+0

它以像素爲單位,因爲高度測量會返回像素數量。 – npace

9

,如果你的活動是不是全屏,使用下面的代碼:在cocos2d-x我們已經得到CCEditBox

content.getViewTreeObserver().addOnGlobalLayoutListener(
      new ViewTreeObserver.OnGlobalLayoutListener() { 

       @Override 
       public void onGlobalLayout() { 
        // TODO Auto-generated method stub 
        if (keyBoardHeight <= 100) { 
         Rect r = new Rect(); 
         content.getWindowVisibleDisplayFrame(r); 

         int screenHeight = content.getRootView() 
           .getHeight(); 
         int heightDifference = screenHeight 
           - (r.bottom - r.top); 
         int resourceId = getResources() 
           .getIdentifier("status_bar_height", 
             "dimen", "android"); 
         if (resourceId > 0) { 
          heightDifference -= getResources() 
            .getDimensionPixelSize(resourceId); 
         } 
         if (heightDifference > 100) { 
          keyBoardHeight = heightDifference; 
         } 

         Log.d("Keyboard Size", "Size: " + heightDifference); 
        } 
        // boolean visible = heightDiff > screenHeight/3; 
       } 
      }); 
+0

謝謝,status_bar_height是非常非常重要的,如果你想翻譯編輯視圖Y – djdance

2

內部擴展 - > GUI-> CCEditBox,你可以找到類CCEditBox。

美的是它隱藏在現場其他地方的敲擊鍵盤。並在您的編輯框放置在場景太低時自動移動鍵盤。

如果使用了cocos2d-x V2.1.3,那麼你可以通過導航前往

標本:> CPP-> TestCpp->類 - > ExtensionTest-> EditBoxTest到示例項目。

從現在開始我只是用它來代替CCTextField。只是碰到它昨天:)

+0

,並抱歉沒有添加它作爲評論,因爲我根本不能。 –

17
Rect r = new Rect(); 
View rootview = this.getWindow().getDecorView(); // this = activity 
rootview.getWindowVisibleDisplayFrame(r); 

的這個結果是空間應用程序使用屏幕上的量(即使活動調整工作)。顯然,剩下的屏幕空間將通過鍵盤(如果可見)使用

找到ID在這裏:https://github.com/freshplanet/ANE-KeyboardSize/blob/master/android/src/com/freshplanet/ane/KeyboardSize/getKeyboardY.java

+1

這就是最好的答案 – Apfelsaft

+2

對我無效 –

+0

您確定鍵盤在那個時間點是可見的嗎?我遇到了一些問題,我必須在更新活動佈局時獲取維度。 – FDIM

3

你不能告訴。不,真的:你根本看不出。

鍵盤不需要是任何特定的形狀。它不必放置在屏幕底部(most popular選項are notmany),當您更改文本字段時(它們幾乎不依賴於標誌),它不必保持其當前大小。它甚至不必是rectangular。它也可能只是接管了entire screen

+1

您是否找到了解決方案,或者Android僅僅是無法提供真正的應用程序?我的意思是,在某種意義上是超動態的,但不是爲了處理動態 –

0

安卓顯示屏幕的ROOT_VIEW可以被視爲一個單一的屏幕視圖,其中包含顯示活動視圖的可見顯示框。

當顯示或隱藏屏幕上的SOFT KEYBOARD時,此可見顯示框會被調整。

注:請看兩個圖像通過點擊,以便更好地理解下面給出的鏈接

所以顯示屏的根視圖可以看作: ​​

的調整具有SOFT KEYBOARD打開和關閉的可見顯示框可以被顯示爲: VISIBLE_DISPLAY_SCREEN adjustment

這種對VISUAL DISPLAY FRAME的調整可以很好地使用找出鍵盤作爲高度:

(當軟鍵盤是打開的)

SOFT_KEYBOARD_HEIGHT = ROOT_VIEW_HEIGHT - (VISUAL_DISPLAY_FRAME_HEIGHT + EXTRA_SCREEN_HEIGHT)

實現上述的代碼是:

int mExtraScreenHeight=-1, mKeyboardHeight=-1; 
boolean mKeyboardOpen; 



    rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 

      int rootViewHeight, visibleDisplayFrameHeight, fakeHeight; 

      /* (rootViewHeight - visibleDisplayFrameHeight) is not the real height of the keyboard 
       it is the fake height as it also consist of extra screen height 
       so FAKE_HEIGHT = KEYBOARD_HEIGHT + EXTRA_SCREEN_HEIGHT 

       To get keyboard height extra screen height must be removed from fake height 
      */ 

      Rect rect = new Rect(); 
      rootView.getWindowVisibleDisplayFrame(rect); 

      rootViewHeight = rootView.getRootView().getHeight(); 
      visibleDisplayFrameHeight = rect.height(); 

      fakeHeight = rootViewHeight-visibleDisplayFrameHeight; 

      if (mExtraScreenHeight == -1){ 
       mExtraScreenHeight=fakeHeight; 
      } 
      /* Suppose the soft keyboard is open then the VISIBLE_DISPLAY_FRAME is in reduced size 
       due to the space taken up by extra screen and the keyboard but when the soft keyboard closes 
       then KEYBOARD_HEIGHT=0 and thus FAKE_HEIGHT = EXTRA_SCREEN_HEIGHT 
      */ 
      else if (fakeHeight <= mExtraScreenHeight){ 
       mExtraScreenHeight=fakeHeight; 
       mKeypadOpen=false; 
      } 
      else if (fakeHeight > mExtraScreenHeight){ 
       mKeypadHeight=fakeHeight-mExtraScreenHeight; 
       mKeypadOpen=true; 
      } 
     } 
    }); 

注意:本onGlobalLayout()函數將被調用,只有當全球佈局更改,如WH軟鍵盤打開。所以軟鍵盤必須打開至少一次以獲得軟鍵盤的高度。

它爲我;)

0

對不起,不能評論,兩個或三個答案幫助我解決了我的問題,他們涉及到使用AddOnGlobalLayoutListener,然後確定鍵盤出現前後的剩餘高度。

我使用的解決方案是基於Rudy_TM的答案。

不過,有一點我必須找到是爲了使該方法的工作,你必須具備以下行某處

Window.SetSoftInputMode(SoftInput.AdjustResize); 

之前,我有SoftInput.AdjustNothing(或類似的東西)和它不會工作。現在它運作完美。感謝您的答案!

3

我知道這是一箇舊帖子,但我注意到我選擇的解決方案並不適用於所有設備。似乎有一個矛盾,所以我實現這一點,它似乎是一個包羅萬象的:

 final int[] discrepancy = new int[1]; 
     discrepancy[0] = 0; 

     // this gets the height of the keyboard 
     content.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 

      @Override 
      public void onGlobalLayout() { 
       Rect r = new Rect(); 
       View rootview = activity.getWindow().getDecorView(); // this = activity 
       rootview.getWindowVisibleDisplayFrame(r); 

       int screen_height = rootview.getRootView().getHeight(); 
       int keyboard_height = screen_height - (r.bottom + r.top) - discrepancy[0]; 

       if (discrepancy[0] == 0) { 
        discrepancy[0] = keyboard_height; 
        if (keyboard_height == 0) discrepancy[0] = 1; 
       } 

       int margin_bottom = keyboard_height + Helper.getDp(10, activity); 

       RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) carousel_container.getLayoutParams(); 
       params.setMargins(0, 0, 0, margin_bottom); 

       //boolean visible = heightDiff > screenHeight/3; 
      } 
     }); 

當聽衆第一次調用它測量屏幕無鍵盤,如果有差異我佔了它下一次。如果沒有差異,我將差異設置爲1,以便它不再爲0。

0

後搜索的時間我找到了解決辦法如果你想設置windowSoftInput="adjustPan"

這裏是代碼片段:

final View root = findViewById(android.R.id.content); 
    root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    Rect r = new Rect(); 
    { 
     root.getWindowVisibleDisplayFrame(r); 
    } 
    @Override 
    public void onGlobalLayout() { 
     Rect r2 = new Rect(); 
     root.getWindowVisibleDisplayFrame(r2); 
     int keyboardHeight = r.height() - r2.height(); 
     if (keyboardHeight > 100) { 
      root.scrollTo(0, keyboardHeight); 
     } 
     else { 
      root.scrollTo(0, 0); 
     } 
    } 
}); 

在此代碼後,我發現鍵盤的高度我滾動視圖直到沒有被鍵盤覆蓋,這是找到鍵盤高度的主要原因。

按照docs

void getWindowVisibleDisplayFrame(Rect outRect)檢索其中窗口這一觀點被附着到已被放置在整個可見顯示尺寸