onGlobalLayout区分各种调用

nmx*_*ime 11 android android-view android-viewgroup

我有一个徽标视图,这是一个包含单个的全屏片段ImageView.在徽标图像完全可见后,我必须执行一些操作.

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

@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;
    }
Run Code Online (Sandbox Code Playgroud)

我的确切问题是,onGlobalLayout此视图层次结构被调用两次.

我知道,onGlobalLayout是在调用performTraversalView.java,因此这是预期.

对于具有单个子视图的单亲的用例,我想区分视图属性,这样在徽标图像完全可见之后doSpecialLogic调用一次[ onGlobalLayout被调用两次].请提出一些想法.

Sar*_*ana 5

每次视图布局或可见性更改时都会调用OnGlobalLayoutListener.也许您重置了doSpecialLogic调用中的视图?
编辑 为@ 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();
Run Code Online (Sandbox Code Playgroud)