处理视图可见性更改而不覆盖视图

Fed*_*nzi 15 android

有没有办法处理视图可见性更改(例如,从GONE到VISIBLE)而不覆盖视图?

有点像View.setOnVisibilityChangeListener();

Nic*_*ler 49

您可以使用a GlobalLayoutListener来确定视图可见性是否有任何更改.

myView.setTag(myView.getVisibility());
myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        int newVis = myView.getVisibility();
        if((int)myView.getTag() != newVis)
        {
            myView.setTag(myView.getVisibility());
            //visibility has changed
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 这有效,但它只适用于从GONE到VISIBLE的更改的布局更改,反之亦然,因为INVISIBLE不会触发布局更改.我对吗? (3认同)

Dev*_*inM 10

除了 @string.Empty 的解决方案之外,这是 Kotlin 的扩展实现。

fun View.visibilityChanged(action: (View) -> Unit) {
    this.viewTreeObserver.addOnGlobalLayoutListener {
        val newVis: Int = this.visibility
        if (this.tag as Int? != newVis) {
            this.tag = this.visibility

            // visibility has changed
            action(this)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样实现它

myView.visibilityChanged { view ->
    when (view.visibility) {
        VISIBLE -> { /* Do something here */ }
        GONE -> { /* or here */ }
    }

}
Run Code Online (Sandbox Code Playgroud)