2015-07-07 16 views
13

Tôi thêm chế độ xem bởi WindowManager phía trên bàn phím mềm với TYPE_APPLICATION_PANEL, nhưng nó không hoạt động trên một số điện thoại, không phải TYPE_SYSTEM_ALERT. Tôi nên làm gì để làm cho nó xảy ra trên tất cả các điện thoại?Làm cách nào để đảm bảo cửa sổ luôn hiển thị trên bàn phím mềm?

+0

Bạn có nghĩa là "vượt quá" hoặc "ở trên" (hoặc trên đầu bàn phím mềm) không? –

+0

trên đầu bàn phím mềm. – handrenliang

Trả lời

6

Có, điều này có thể được thực hiện bằng cách sử dụng PopupWindow trên bàn phím mềm.

Bạn có thể kiểm tra thư viện this hoặc thư viện this, nơi họ đã triển khai chính xác những gì bạn đang tìm kiếm.

enter image description here

Họ đã thêm chế độ xem tùy chỉnh trên bàn phím. Bạn có thể chỉ cần làm theo mẫu triển khai của họ và thêm chế độ xem của bạn một cách dễ dàng. tôi vẫn muốn nhấn mạnh một số mã quan trọng,

Ban đầu xác định chiều cao bàn phím,

 // Defining default height of keyboard which is equal to 230 dip 
     final float popUpheight = getResources().getDimension(
       R.dimen.keyboard_height); 
     changeKeyboardHeight((int) popUpheight); 

Phương pháp này được sử dụng để kiểm tra tự động chiều cao bàn phím và tầm nhìn của nó,

/** 
    * Checking keyboard height and keyboard visibility 
    */ 
    int previousHeightDiffrence = 0; 
    private void checkKeyboardHeight(final View parentLayout) { 

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

        @Override 
        public void onGlobalLayout() { 

         Rect r = new Rect(); 
         parentLayout.getWindowVisibleDisplayFrame(r); 

         int screenHeight = parentLayout.getRootView() 
           .getHeight(); 
         int heightDifference = screenHeight - (r.bottom); 

         if (previousHeightDiffrence - heightDifference > 50) {       
          popupWindow.dismiss(); 
         } 

         previousHeightDiffrence = heightDifference; 
         if (heightDifference > 100) { 

          isKeyBoardVisible = true; 
          changeKeyboardHeight(heightDifference); 

         } else { 

          isKeyBoardVisible = false; 

         } 

        } 
       }); 

    } 

Và phương pháp này thay đổi chiều cao bàn phím biểu tượng cảm xúc dựa trên chiều cao bàn phím thực tế,

/** 
    * change height of emoticons keyboard according to height of actual 
    * keyboard 
    * 
    * @param height 
    *   minimum height by which we can make sure actual keyboard is 
    *   open or not 
    */ 
    private void changeKeyboardHeight(int height) { 

     if (height > 100) { 
      keyboardHeight = height; 
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
        LayoutParams.MATCH_PARENT, keyboardHeight); 
      emoticonsCover.setLayoutParams(params); 
     } 

    } 

Tôi đã làm theo cách tiếp cận này và đã có chính xác những gì tôi muốn. Tôi chắc chắn bạn sẽ có thể triển khai điều này tùy thuộc vào yêu cầu của ứng dụng của bạn.

Hy vọng điều đó sẽ hữu ích.

+0

Câu trả lời có giúp ích cho bạn không? Hay bạn cần nhiều gan hơn? –

+0

Tôi sẽ thử sau. – handrenliang

+0

Aritra, Rất tiếc vì đã chấp nhận câu trả lời của bạn gần đây. – handrenliang

1

TYPE_SYSTEM_ALERT cửa sổ không hoạt động trên một số thiết bị, nhưng nếu chúng hoạt động, chúng sẽ được đặt phía trên cửa sổ IME. Tôi khuyên bạn nên thử các cửa sổ TYPE_TOAST. Bánh mì nướng hoạt động trên tất cả các thiết bị và được hiển thị trên bàn phím. Nhưng trên một số phiên bản Android như 4.1 bánh mì nướng không chấp nhận đầu vào của người dùng như chạm hoặc sự kiện quan trọng.

TYPE_PHONE cũng có thể là một ứng cử viên tốt để giải quyết vấn đề của bạn nhưng tôi nghĩ rằng nó sẽ không hoạt động trên các thiết bị mà TYPE_SYSTEM_ALERT không hoạt động.

CẬP NHẬT: Một điều bạn có thể thử là thêm WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM vào WindowManager.LayoutParams.flags. Lá cờ này yêu cầu Android định vị một cửa sổ để nó có thể bao gồm IME. Trong trường hợp này, bạn phải bỏ đặt cờ WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE. Trong cấu hình này, cửa sổ sẽ được lấy nét và phải được đặt ở phía trước IME.

Một tùy chọn khác là chỉ cần đặt cờ WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE và gắn cờ WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM. Nó cũng sẽ làm cho cửa sổ của bạn được đặt trước IME nhưng cửa sổ sẽ không thể lấy nét được.

Các vấn đề liên quan