【问题标题】:Detect view visibility in hidden fragment检测隐藏片段中的视图可见性
【发布时间】:2017-02-23 21:45:55
【问题描述】:

当视图所属的片段显示/隐藏时,有什么方法可以检测视图是否改变可见性?

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

然而,一个视图只有回调来通知它何时附加或从窗口分离。有什么方法可以检测视图内部的可见性变化(不是通过片段调用公共视图方法)?

这些是我测试过的方法:

  • onAttachedToWindow():未在片段上调用 ​​show() / hide()
  • onDetachedFromWindow():未在片段上调用 ​​show() / hide()
  • getGlobalVisibilityRect():无论片段是否显示/隐藏,都返回 true(可见)

重要提示:视图是独立的。它不能有对片段的引用,反之亦然,片段不能在视图上调用任何方法。

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

【问题讨论】:

    标签: android android-fragments android-view visibility


    【解决方案1】:

    关于第一个问题,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.:我将扩展我的问题以澄清片段/视图问题 2.:分离()不起作用,因为正如我所说,视图层次结构不能被破坏。
    • @McFarlane 我以为你说过你不想破坏片段。
    • 你是对的,这个问题可以有不同的解释。我已对其进行了更新以进行澄清。
    • 谢谢你把我推向了正确的方向。唯一需要改变的是使用 isShown() 而不是 getVisibility() 因为后者只返回视图本身的可见性。我已对您的回答进行了修改,等待审核。
    • 事实证明,对于我完全忽略的确切问题,有一种特定的查看方法......那么,更多的咖啡。
    【解决方案2】:

    @bigO 的回答效果很好,但是有一个更简单的解决方案:

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

    每次显示/隐藏片段时都会调用此视图方法,并分别使用View.VISIBLEView.GONE的值

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 2012-05-10
      • 2011-02-02
      相关资源
      最近更新 更多