这是我的视图层次结构:
-RelativeLayout [rootView] (根)
LinearLayout [menu_holder](菜单片段布局)
RelativeLayout [app_holder](应用内容布局)
Action Bar(实现 ActionBar < 2.1 的自定义视图
FrameLayout [content_fragment](加载内容片段的布局)
FloatingMenu(自定义 LinearLayout 以显示浮动小部件)
<com.example.app.views.widgets.RootLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drag_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/white" >
<LinearLayout
android:id="@+id/menu_holder"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/red"
android:orientation="vertical" />
<com.example.app.views.widgets.AppHolder
android:id="@+id/app_holder"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/gray" >
<com.example.app.widgets.ActionBar
android:id="@+id/action_bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/content_holder"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/action_bar"
android:background="@drawable/backrepeat" >
</FrameLayout>
<com.example.app.widgets.FloatingMenu
android:id="@+id/floating_menu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:padding="15dp"
android:visibility="gone" />
</com.example.app.views.widgets.AppHolder>
</com.example.app.views.widgets.RootLayout>
现在我将 menu_holder 和 app_holder 都加载到 rootView 中,这样 app_holder 就保持在顶部。现在,当用户按下 MENU 按钮时,app_holder 向右滑动以在左侧显示底层菜单片段,如下图所示:
我在可运行文件中使用了一个滚动条来向右滑动 app_holder。在偏移我的 app_holder 后,我还每隔 16 毫秒在 rootView 上调用一次 invalidate()。
它工作正常,但是当菜单片段可见时,当任何内容加载到 content_fragment(可见性集或从 web 加载)中时,就会出现问题。无效的视图(越界)调用 requestLayout() 并且以下布局调用将 app_holder 重置为其初始位置。我已经在我的 content_fragment 上实现了延迟加载列表视图,因此列表视图上的任何更新(notifyDataSetChanged 等)都会启动重新布局调用。
如何阻止这种情况发生?
在右侧所有动态加载的视图上覆盖和评论 requestLayout() 将解决问题,但是还有其他正确的方法吗?