相关疑难解决方法(0)

大小更改后,自定义ViewGroup内的视图无法呈现

我遇到了一个令我难过的问题,我希望有人可以给我一些指示.

我正在使用一个使用自定义ViewGroup的应用程序(实际上是一个包含RelativeLayout的FrameLayout)来呈现事件日历.日历中的事件表示为视图,其大小根据事件的持续时间和包含视图的大小而定.

我遇到了调整包含FrameLayout大小时发生的问题.当前实现将删除表示事件的所有视图,并尝试添加新事件并根据FrameLayout的当前大小计算其大小.这项工作是通过View的onSizeChanged()方法触发的,该方法在FrameLayout中被覆盖.

调整视图大小时,将执行此代码并更新视图,但是,它们实际上都不会在屏幕上呈现... FrameLayout中包含的视图根本不可见.如果我在hierarchyviewer工具中加载视图,它们是视图树的一部分,并在概述中列出它们应该位于的位置,但它们不会显示.(请注意,视图在FrameLayout的初始渲染中是可见的......只有在调整大小后它们才会消失.)

看来调整大小期间的事件顺序如下:

onMeasure()
onMeasure()
onSizeChanged()
onLayout()
Run Code Online (Sandbox Code Playgroud)

重置视图后调用requestLayout()(在onSizeChanged()内)似乎没有任何效果.但是,如果在调用requestLayout()之前导致一些延迟,则视图将变为可见.我可以通过生成一个线程和休眠来创建这个延迟,或者通过创建一个虚拟按钮来简单地调用requestLayout()并在调整大小后自己调整它,或者甚至在onSizeChanged()的末尾放置这个丑陋的黑客:

post(new Runnable() {
    public void run() {
        requestLayout();
    }
});
Run Code Online (Sandbox Code Playgroud)

当我使用这个hack时,包含的视图是可见的,事件的顺序如下:

onMeasure()
onMeasure()
onSizeChanged()
onLayout()
onMeasure()
onMeasure()
onLayout()
Run Code Online (Sandbox Code Playgroud)

因此,似乎强制第二个度量传递(在视图树被修改之后)使得包含的视图应该是可见的.为什么延迟对requestLayout()的调用对我来说这是一个谜.

谁能提供任何关于我做错的指示?

我意识到,如果不查看一些代码,这有点难以理解,因此我创建了一个小型示例应用程序,它展示了我的问题并使其在Github上可用:

https://github.com/MichaelSims/ViewGroupResizeTest

我上面提到的hack致力于一个单独的分支:

https://github.com/MichaelSims/ViewGroupResizeTest/tree/post-runnable-hack

如果我能提供任何其他信息,请提前通知我并提前致谢.

android rendering resize custom-view viewgroup

20
推荐指数
1
解决办法
7957
查看次数

Android:如何重绘图形元素?

我创建了一个扩展View的类RoundIcon,该类包含setIconImage()方法:

public void setIconImage(int imageFromResources) {
    iconImage = BitmapFactory.decodeResource(getResources(), imageFromResources);
    iconWidth = iconImage.getWidth();
    iconHeight = iconImage.getHeight();
    refreshDrawableState();
}
Run Code Online (Sandbox Code Playgroud)

并且有一个方法onDraw():

@Override
protected void onDraw(Canvas canvas) {

    if(px == 0 || py == 0)
    {
        px = 50;
        py = 50;
    }


    canvas.drawCircle(px, py, circleRadius, circlePaint);
    canvas.save();

    if(iconImage != null)
    {
        int cardinalX = px - iconWidth/2;
        int cardinalY = py - iconHeight/2;
        canvas.drawBitmap(iconImage, cardinalX, cardinalY, iconPaint);
    }

    canvas.restore();
}
Run Code Online (Sandbox Code Playgroud)

问题是每次从主活动调用方法setIconImage()时都不执行onDraw()函数,因此图标在用户界面中不会改变.

有没有人知道如何修改代码,以便每次调用方法setIconImage时重绘图像?

user-interface android refresh

17
推荐指数
2
解决办法
5万
查看次数