Android 检测隐藏片段中的视图可见性

Android 检测隐藏片段中的视图可见性,android,android-fragments,android-view,visibility,Android,Android Fragments,Android View,Visibility,当视图所属的片段显示/隐藏时,是否有任何方法可以检测视图的可见性是否发生变化 片段有一个方法onHiddenChanged()来通知可见性的变化 但是,视图只有在从窗口附加或分离视图时才有回调通知。是否有任何方法可以检测视图内部的可见性更改(而不是通过片段调用公共视图方法) 以下是我测试过的方法: onAttachedToWindow():在片段show()/hide() OnDepachedFromWindow():在片段show()/hide() getGlobalVisibilityRe

当视图所属的片段显示/隐藏时,是否有任何方法可以检测视图的可见性是否发生变化

片段有一个方法
onHiddenChanged()
来通知可见性的变化

但是,视图只有在从窗口附加或分离视图时才有回调通知。是否有任何方法可以检测视图内部的可见性更改(而不是通过片段调用公共视图方法)

以下是我测试过的方法:

  • onAttachedToWindow()
    :在片段
    show()
    /
    hide()
  • OnDepachedFromWindow()
    :在片段
    show()
    /
    hide()
  • getGlobalVisibilityRect()
    :返回true(可见),无论片段是否显示/隐藏
重要:视图是独立的。它不能有对片段的引用,反之亦然,片段不能调用视图上的任何方法


或者,是否有任何方法可以在不破坏其视图的情况下从窗口分离片段的视图层次结构?

关于第一个问题,
ViewTreeObserver.OnGlobalLayoutListener
可能会起作用

yourView.setTag(yourView.getVisibility());  //set this somewhere in your code, maybe after you create the view

yourView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {
        int newVisibility = yourView.getVisibility();
        if((int)yourView.getTag() != newVisibility)
        {
            Log.d("VISIBILITY_CHANGE", "Visibility Changed");
        }
    }
});
关于第二个问题,是的,有一种方法可以在不破坏片段的情况下将片段的视图层次结构与窗口分离。您可以使用FragmentTransaction类的
detach()
方法

getSupportFragmentManager().beginTransaction().detach(fragment).commit();
从UI分离给定片段。这与将其放在后堆栈上时的状态相同:片段已从UI中删除,但其状态仍由片段管理器主动管理。进入此状态时,其视图层次结构将被破坏


@bigO的答案非常有效,但是有一个更简单的解决方案:

@Override
protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
    super.onVisibilityChanged(changedView, visibility);
    Log.d(TAG, visibility == View.VISIBLE ? "visible" : "invisible");
}

每次使用
view.VISIBLE
view.GONE

1的相应值显示/隐藏片段时,都会调用此视图方法。我将展开我的问题以澄清片段/视图问题2.:detach()不起作用,因为正如我所说的,视图层次结构不能被破坏。@McFarlane我以为你说过你不希望片段被破坏。你是对的,这个问题可能会有不同的解释。为了澄清,我更新了它。谢谢,这让我走上了正确的方向。所需的唯一更改是使用isShown()而不是getVisibility(),因为后者只返回视图本身的可见性。我已经对你的答案进行了编辑,等待审核。结果发现,对于我所遇到的问题,有一个特定的查看方法,而我完全忽略了。。。那就再来点咖啡吧。