我有一个全屏横向应用程序(Cocos2d-x/NDK),带有一个输入字段,我在运行时设置的位置如下
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mInstance.mEditText.getLayoutParams();
params.topMargin = (int)newY;
params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
mInstance.mEditText.setLayoutParams(params);
Run Code Online (Sandbox Code Playgroud)
它在大多数设备上运行都很酷,但我有一种设备,其中软键盘动态增长,上面有“建议”行。那就是奇怪的事情发生的时候。
如果我的 EditText 位于屏幕顶部的某个位置,即它的矩形不与键盘相交,则不会发生任何变化,EditText 保持在原来的位置,一切正常。但是,如果我的 EditText 位于屏幕中间,因此键盘将与它重叠,它就会开始向上移动(带有动画)。
我成功地使用 SOFT_INPUT_ADJUST_PAN 来确定键盘高度(通过getWindowVisibleDisplayFrame调用之间的差异),因此我不能仅通过设置adjustmentNothing标志来禁用平移,我将坚持使用adjustmentPan。
问题是,当调整软键盘大小(对于建议行)时,我无法理解我的视图位置到底做了什么。在我的 onGlobalLayout 中我尝试观看:
- TextView getY(),
- TextView getTranslationY(),
- TextView RelativeLayout params (topMargin, bottomMargin),
- TextView getLocationOnScreen,
- TextView getGlobalVisibleRect top & bottom,
- Activity getWindowVisibleDisplayFrame rect top & bottom.
Run Code Online (Sandbox Code Playgroud)
以上内容均未更改!但 TextView 无论如何都是向上移动的。我相信在软键盘出现后,视图树中的某个地方应用了一些偏移。但是为什么 getLocationOnScreen 不显示这个呢?为什么 getGlobalVisibleRect 也不知道任何有关位置变化的信息?
我想为我的 EditText 设置确切的位置,所以即使我无法阻止它向上移动(设置adjustmentPan标志的权衡),至少我需要知道它向上移动了多少,以应用反向转换。
我尝试了一个非常hacky的解决方法:在我的EditText beforeTextChanged()方法中,我将TextView的布局topMargin设置为0,以确保当建议行出现时,它不会移动我的TextView,因为它不再重叠。然后在 onGlobalLayout() 中我恢复正确的 …