我必须在我的应用中实现可滑动的菜单。用户应该能够通过点击它并向左/向右移动来显示/隐藏它。
为了实现这一点,我创建了扩展 FrameLayout 的自定义 SlidableFrameLayout 。 通过重写 onTouchEvent 方法,我计算幻灯片位置并调用
private void setLeftLayout(int left) {
layout(left, getTop(), getRight(), getBottom());
}
更改 SlidableFrameLayout 的位置。一切正常,但是当我键盘显示(在聚焦EditText之后)时, SlidableFrameLayout 将其左值更改为0,因此如果菜单关闭,它将被打开。当我隐藏键盘时会发生同样的事情(通常,它会出现在阻止调用布局方法的所有操作中)。
我无法发明如何修复它。你可以帮帮我吗?如果需要任何其他信息,我会附上它。感谢
答案 0 :(得分:1)
我认为您的问题与直接调用布局有关。当容器视图由于键盘显示/隐藏时更改大小onMeasure / onLayout将使用视图的默认边界调用。在你的情况下,我猜测左边界是0,所以每次你的窗口调整大小时都会调用0左边的布局。 相反,你可能想要使用像setTranslationX或scrollTo ..
这样的东西 祝你好运!答案 1 :(得分:0)
结果,我改变了我的逻辑:
private void setLeftLayout(int left) {
FrameLayout.LayoutParams params = getFrameLayoutParams();
params.leftMargin = left;
params.rightMargin = -left;
requestLayout();
}
在我的情况下,view是FrameLayout的父级,所以我没有在方法的第一行添加任何条件。这种方法很好用。