Android custom keyboard - Preview view constrained to parent layout

后端 未结 3 1347
清歌不尽
清歌不尽 2020-12-30 10:06

I have created a custom keyboard, which works fine - except the preview views for the top two rows of keys are not displayed high enough. Their vertical position is being co

3条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-30 10:46

    The preview key is actually a PopupWindow created in the constructor for KeyboardView. (See the code here).

    The problem that you are seeing is because the PopupWindow is being clipped by its parent. If clipping can be disabled for the PopupWindow then the preview key will be able to "pop" outside of the keyboard view. You can see that this approach works if you set a breakpoint at the above-referenced code and execute the following code:

    mPreviewPopup.setClippingEnabled(false)
    

    See setClippingEnabled in the documentation for PopupWindow. By default, clipping is enabled.

    setClippingEnabled

    void setClippingEnabled (boolean enabled)

    Allows the popup window to extend beyond the bounds of the screen. By default the window is clipped to the screen boundaries. Setting this to false will allow windows to be accurately positioned.

    It says "screen," but it applies to the keyboard window as well.

    The remaining question is: How to get clipping disabled? Unfortunately, mPreviewPopup is a private variable. Reflection will give access but is not ideal. I have not found another way to disable clipping for this private PopupWindow, so this is just pointing a way to a resolution and not the resolution itself.


    Update: I took another look at what is going on. Here is what I found with the various API levels.

    APIs 17-21: Key preview is allowed to pop outside of the boundaries of the keyboard.

    APIs 22,23,25-26: The key preview is constrained to the boundaries of the keyboard but does display in its entirety. This is what the OP was seeing.

    API 24: Key preview is constrained to the boundaries of the keyboard but is otherwise clipped. (Broken)

    So, the change occurred with API 22. The only substantive difference I see between API 21 and API 22 is support for the FLAG_LAYOUT_ATTACHED_IN_DECOR flag. (Also see setAttachedInDecor.) This code does deal with the placement of the popup window, so it may be related to this problem. (I no longer believe that this is true.)

    I also found this which also may be related. (Maybe...)

    setClippingEnabled() works on API 22-26 to permit the preview key to pop outside the boundaries of the keyboard layout. Other than using reflection, I don't see a way to correct the problem.

    This may qualify for a bug report although the new constrained behavior may be the expected behavior.

    Here is a video of API 26 exhibiting the problem, then I set the mClippingEnabled flag to false in PopupWindow.java and show the corrected behavior.

提交回复
热议问题