我正在我的Android应用中实现一个功能,用户可以在FrameLayout
中动态添加和删除视图,并使用拖放技术将其置于绝对坐标位置。用户通常会将楼层规划图像作为背景加载到FrameLayout
,然后添加代表房屋内灯具的按钮,并在适当的位置放置它们。
无论如何,我有一个问题,我需要在加载FrameLayout
时向Fragment
充气并添加视图。子视图源自SQLite数据库中的信息。为了正确定位子视图(取决于方向),我需要考虑FrameLayout
的宽度和高度。因此,我无法在onCreateView()
中的Fragment
中完成此项工作。
FrameLayout
实际上是DragArea
(为了简单起见,我仍会将此对象称为FrameLayout
),这是一个扩展FrameLayout
的自定义类。为了在计算宽度/高度时收到Fragment
的回调,我在onSizeChanged
中覆盖了调用FrameLayout
的{{1}}。
这是奇怪的事情。如果我在我的Fragment
的回调方法中创建视图并调用Fragment
似乎没有任何事情发生。检查说这些意见已添加到FrameLayout.invalidate
,但没有看到。如果我打开层次结构查看器并按“加载视图层次结构”,则会显示视图。所以这里似乎有副作用来吸引观点。我试图调用FrameLayout
并通过在FrameLayout.requestLayout()
中执行逻辑来确保它在UI线程上运行,但它没有任何区别。
但是!如果我改为将getActivity().runOnUiThread()
中的逻辑放在(无用)onPostExecuted()
中,则会绘制视图。
请参阅下面的代码,以便在评论中进一步说明。回调方法名为AsyncTask
,并从onWidthAvailable()
调用。
我还试图在以后的任意时间点调用FrameLayout.onSizeChanged()
而没有运气。
invalidate()