- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我遇到了一个让我很困惑的问题,我希望有人能给我一些建议。
我正在开发一个使用自定义 ViewGroup(实际上是包含 RelativeLayout 的 FrameLayout)来呈现事件日历的应用程序。日历中的事件表示为根据事件的持续时间和包含 View 的大小调整大小的 View 。
我遇到了在调整包含 FrameLayout 大小时出现的问题。当前的实现删除了所有代表事件的 View ,并尝试添加新的 View 并根据 FrameLayout 的当前大小计算它们的大小。这项工作是通过 View 的 onSizeChanged() 方法触发的,该方法在 FrameLayout 中被覆盖。
当调整 View 大小时,会执行此代码并更新 View ,但是,它们都不会真正呈现在屏幕上...... FrameLayout 中包含的 View 根本不可见。如果我在层次结构查看器工具中加载 View ,它们是 View 树的一部分,并在概述中它们应该在的位置上概述,但它们不显示。 (请注意, View 在 FrameLayout 的初始渲染中是可见的……只有在调整大小后它们才会消失。)
看来resize期间的事件顺序如下:
onMeasure()
onMeasure()
onSizeChanged()
onLayout()
重置 View (在 onSizeChanged() 内部)后调用 requestLayout() 似乎没有效果。但是,如果我在调用 requestLayout() 之前造成一些延迟, View 就会变得可见。我可以通过产生一个线程并休眠来导致这种延迟,或者通过创建一个简单地调用 requestLayout() 并在自己调整大小后按下它的虚拟按钮,或者甚至是放在 onSizeChanged() 末尾的这个丑陋的黑客:
post(new Runnable() {
public void run() {
requestLayout();
}
});
当我使用这个 hack 时,包含的 View 是可见的,并且事件的顺序如下:
onMeasure()
onMeasure()
onSizeChanged()
onLayout()
onMeasure()
onMeasure()
onLayout()
因此,似乎强制第二次测量通过(在修改 View 树之后)会使包含的 View 按应有的方式可见。为什么延迟对 requestLayout() 的调用对我来说是个谜。
谁能指出我做错了什么?
我意识到如果不看一些代码就很难理解,所以我创建了一个小示例应用程序来展示我的问题并在 Github 上提供:
https://github.com/MichaelSims/ViewGroupResizeTest
我上面提到的 hack 提交到一个单独的分支:
https://github.com/MichaelSims/ViewGroupResizeTest/tree/post-runnable-hack
如果我可以提供任何其他信息,请提前告诉我并感谢。
最佳答案
这不是 hack,它应该是这样工作的。 onSizeChanged() 作为布局传递的一部分被调用,您不能/不应该在布局传递期间 requestLayout()。在事件队列上发布 requestLayout() 以表明您在布局传递期间更改了 View 层次结构是正确的。
关于android - 自定义 ViewGroup 中的 View 在大小更改后未呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5852758/
我有一个名为 Customview 的 viewGroup。我需要在运行时将另一个具有多个 subview 的 viewGroup 分配给 Customview。如果以上一个是可能的,我没有正确获取
我有一个包含 N 个子项的自定义 ViewGroup。现在,我创建了另一组 ViewGroup。我想将第二个 ViewGroup 添加到第一个。我怎么做?谢谢.. 最佳答案 来自代码: firstVi
我遇到了一个奇怪的问题。例如,我们有这样的布局: 我们的屏幕将变黑。如果我将 LinearLayout 替换为 FrameLayout 或 ConstraintLayout,结果相同
我希望能够以编程方式将一个 View 组添加到另一个 View 组。两者都在 xml 中定义如下,连同我的 onCreate 方法: 主.xml: secondlayout.xml:
我不确定我的问题是否可以理解。我的布局中有一个 Image 和一个 ViewGroup。 ViewGroup 与 GridView 相当,我在其中有可以拖放的项目。现在我有兴趣将我的 ViewGrou
知道为什么会出现此崩溃吗?跟踪只有 native 代码,因此很难追踪到它。当我在 Fragment 中运行动画并且当动画结束时我为 FragmentStatePagerAdapter 调用 notif
在方法内部,我调用 addView和 removeView如下: public class EnclosingClass extends FrameLayout { ... void
如何检索以“llIndex”为 id 的 linearLayout 的索引。谢谢 最佳答案 非常简单 - 在 View 的父级上调用 indexOfChild 函数:
我有子元素(不是根)RelativeLayout 的布局,然后我创建 ViewPager 并将其作为我的相对布局的子元素插入,就像 +相对布局(根) | +-- 相对布局(子) | +-- -- 浏览
我有一个布局,其根 ViewGroup 有两个 child ,其中只有一个始终可见。如果不适用,另一个 child 的可见性将在运行时设置为 View.GONE。 当两个 child 都可见时,高度设
我的 XML 布局中有以下节点: TagLayout 是一个扩展 ViewGroup 的类,基本上包含一堆带有文本的按钮(一个自定义对象,充当标签,但它既不在这里也不在那里)。 问题是当按钮太多时,
如果我尝试使用 ViewGroup,我会收到此错误 “ViewHolder cannot be resolved to a type”。没有具体的import present,如何使用? 最佳答案 也
我的自定义 ViewGroup 有问题。我连续布置了 3 个 child ,并使用 Scroller 滚动到中间的 child 。根据用户的触摸输入,我更改了应该显示的子项并请求新布局。然后我按新顺序
我正在尝试在 Android 中制作简单的翻译动画。以下不起作用: public class MyView extends ViewGroup { ... TranslateAnima
为什么 android:clipChildren="false"不工作?我想实现与 CSS overflow: visible 相同的效果,这样即使 subview 位于其父布局之外,它们也是可见的。
假设有一个包含多个子项的 ViewGroup。至于这个 ViewGroup,我想让它管理所有子项的所有 MotionEvent,这表示 VG 将 1. 能够在事件被发送到目标( child )之前拦截
我有 CustomComponent 类,它扩展了 ViewGroup。 CustomComponent源代码: public class CustomComponent extends
我的 Android 应用程序中有几个具有相同基本结构的 Activity,我正试图让我的布局变干。重复的代码如下所示。它包含一个带有页脚的可滚动区域,该页脚具有“后退”和“仪表板”链接。还有一个 F
我有一个 Android TV 布局,如下图所示。 顶部一个PagerSlidingTabStrip,从服务器拉取数据; 底部有 Fragment 的 ViewPager,每个 Fragment 都有
我正在尝试创建带有内部包含文本的指示器的 fragment slider 。 我在网上找到了一些包含图像 slider 的教程,并将其编辑为文本 slider ,但我收到了此错误消息: android
我是一名优秀的程序员,十分优秀!