0

我必须在我的应用程序中实现滑动菜单。用户应该能够通过点击它并向左/向右移动来显示/隐藏它。

为了实现这一点,我创建了扩展FrameLayout的自定义SlidableFrameLayout。通过覆盖onTouchEvent方法,我计算幻灯片位置并调用

private void setLeftLayout(int left) {
    layout(left, getTop(), getRight(), getBottom());
}

更改SlidableFrameLayout的位置。一切正常,但是当我显示键盘时(在聚焦 EditText 之后),SlidableFrameLayout将其左侧值更改为 0,因此如果菜单关闭,它就会打开。当我隐藏键盘时也会发生同样的事情(通常,它出现在所有阻止调用布局方法的操作中,我认为)。

我无法发明如何解决它。你可以帮帮我吗?如果需要任何其他信息,我会附上。谢谢

4

2 回答 2

1

我认为您的问题与直接调用布局有关。当容器视图由于显示/隐藏键盘而改变大小时,将使用视图的默认边界调用 onMeasure/onLayout。在你的情况下,我猜左边界是 0,所以每次你的窗口调整大小时,都会用 0 来调用布局。相反,您可能想使用 setTranslationX 或 scrollTo 之类的东西。

祝你好运!

于 2013-09-23T06:08:21.630 回答
0

结果,我改变了我的逻辑:

private void setLeftLayout(int left) {
    FrameLayout.LayoutParams params = getFrameLayoutParams();
    params.leftMargin = left;
    params.rightMargin = -left;
    requestLayout();
}

就我而言,view 是 FrameLayout 的父级,所以我没有在方法的第一行添加任何条件。这种方法效果很好。

于 2013-09-30T13:59:27.177 回答