有没有办法检测视图是否在显示/隐藏它所属的片段时更改了可见性?
该片段有一个方法onHiddenChanged()
来通知可见性的变化。
但是视图只有在其附加或从窗口分离时才会通知回调。有没有办法检测视图中的可见性变化 (而不是通过片段调用公共视图方法)?
这些是我测试的方法:
onAttachedToWindow()
:未调用片段show()
/ hide()
onDetachedFromWindow()
:未调用片段show()
/ hide()
getGlobalVisibilityRect()
:无论片段是显示/隐藏重要:视图是独立的。它必须没有对片段的引用,反之亦然,片段不能在视图上调用任何方法。
或者,是否有任何方法可以从窗口中分离片段的视图层次结构而不破坏其视图?
答案 0 :(得分:2)
关于第一个问题,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中删除,但其状态仍由片段管理器主动管理。进入此状态时,其视图层次结构将被销毁。
答案 1 :(得分:0)
@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