gpt4 book ai didi

android - onGlobalLayout 区分各种调用

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:08:50 26 4
gpt4 key购买 nike

我有一个 Logo View ,它是一个包含单个 ImageView 的全屏 fragment 。 Logo 图像完全可见后,我必须执行一些操作。

以下代码用于调用特殊任务

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

ImageView logoImageMaster = new ImageView(getContext());
//logoImageMaster.setImageResource(resID); //even after removing this, i am getting the callback twice
try {
// get input stream
InputStream ims = getActivity().getAssets().open("product_logo.png");
// load image as Drawable
Drawable d = Drawable.createFromStream(ims, null);
// set image to ImageView
logoImageMaster.setImageDrawable(d);
}
catch(IOException ex) {

}
logoImageMaster.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() { //FIXME get called twice. Check this out, no info to distinguish first from second
// Log.e("PANEL", "onGlobalLayout of Logo IV ---------------------------------");
activityInterface.doSpecialLogic();
}
});
return logoImageMaster;
}

我的确切问题是,onGlobalLayout 为此 View 层次结构调用了两次。

我知道 onGlobalLayout 是在 View.javaperformTraversal 中调用的,因此这是预期的。

对于单父单子(monad) View 的用例,我想区分 View 属性,以便 doSpecialLogic 被调用一次[onGlobalLayout 被调用两次] ,之后 Logo 图像完全可见。请提出一些想法。

最佳答案

每次 View 布局或可见性发生变化时都会调用 OnGlobalLayoutListener。也许您在 doSpecialLogic 调用中重置了 View ??
编辑正如@Guille89 所指出的,两次 set 调用导致 onGlobalLayout 被调用两次

无论如何,如果您只想调用一次 OnGlobalLayoutListener 而不需要它做任何其他事情,那么在调用 doSpecialLogic() 之后删除它怎么样?

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
//noinspection deprecation
logoImageMaster.getViewTreeObserver().removeGlobalOnLayoutListener(this);
} else {
logoImageMaster.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
activityInterface.doSpecialLogic();

关于android - onGlobalLayout 区分各种调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38718586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com