【问题标题】:Android - onGlobalLayout is not called by ViewTreeObserverAndroid - ViewTreeObserver 不调用 onGlobalLayout
【发布时间】:2017-04-16 13:10:12
【问题描述】:

我对当前的 Android 项目感到头疼。我想检测当前页面的变化。比如有一个TextView来显示设备时间,每秒更新一次。如何检测这种变化?我在 SO 上搜索了很多(感谢 SO),但没有一个对我有用。

更多信息:我不使用标准活动来创建页面。我的方法是: 所有小部件都被创建到一个 View 对象中,然后用于创建一个容器对象。之后,我只需要定期使用 VSYNC 回调 Choreographer.FrameCallback 来处理这个容器以在画布上绘制。

确实,它可以画画。一切正常。例外:我只想在页面内容发生变化时绘制 canvas。所以回到我开始的问题,如何检测这个“变化”的事件?我确信有某种回调来处理这个问题。我使用了以下解决方案,但是当 textview 的文本更改时,onGlobalLayout 没有被调用。

CanvasAppViewContainer container;//CanvasAppViewContainer extends AbsoluteLayout
LayoutInflater li =(LayoutInflater)getService().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    

View view = li.inflate(resourceId, null);//passed a correct the layout id
container = new CanvasAppViewContainer(getService(), view, getWidth(), getHeight(), getSurface());
rootView = (LinearLayout) findViewById(R.id.rootView); //root element of layout
rootView.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
    @SuppressLint("NewApi")
    @Override
    public void onGlobalLayout() {
        Log.d("test", "onGlobalLayout");
    }
});

顺便说一句:即使我为 textview 注册了视图树观察器,仍然不会调用 onGlobalLayout。

谢谢

【问题讨论】:

    标签: android android-canvas android-view android-viewtreeobserver


    【解决方案1】:

    onGlobalLayout() 仅在 布局 更改时调用。当您想检测 text 中的更改时,请使用 TextView.addTextChangedListener()

    【讨论】:

    • 谢谢。实际上,如果为textview注册视图树观察者,当文本发生变化时,onGlobalLayout()也会在正常活动中被调用。
    • 也许文本的变化会导致 TextView 改变它的大小,这会在你的“正常”活动中触发 OnGlobalLayout()?
    • 我只是重复设置相同的文本。
    • TextView.addTextChangedListener() 是否适用于您的自定义视图?
    • 我没有验证。我认为它会在 TextView 中更改文本后起作用。但这不是我想要的。
    猜你喜欢
    • 1970-01-01
    • 2016-11-06
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多