2016-10-14 11 views
1

Есть ли способ определить, изменяется ли видимость вида, когда фрагмент, к которому он принадлежит, отображается/скрыт?Обнаруживать видимость видимости в скрытом фрагменте

Фрагмент имеет способ onHiddenChanged() для уведомления об изменениях видимости.

Однако у пользователя есть только обратные вызовы для уведомления, когда он прикреплен или отсоединен от окна. Есть ли способ обнаружения изменения видимости внутри вида (не путем вызова метода открытого представления через фрагмент)?

Те методы, которые я уже испытанные:

  • onAttachedToWindow(): не призвали фрагмент show()/hide()
  • onDetachedFromWindow(): не призвали фрагмент show()/hide()
  • getGlobalVisibilityRect(): возвращают истинные (видимые) независимо от того, показан ли фрагмент/скрыт

Важно: Вид автономный. Он не должен ссылаться на фрагмент и наоборот, фрагмент не должен вызывать какой-либо метод в представлении.

В качестве альтернативы, существует ли способ отделить иерархию представлений фрагмента от окна без разрушения его представлений?

ответ

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

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(); 

Отделить данный фрагмент из пользовательского интерфейса. Это то же самое состояние, что и при наложении на задний стек: фрагмент удаляется из пользовательского интерфейса, однако его состояние по-прежнему активно управляется менеджером фрагментов. При входе в это состояние иерархия его зрения уничтожается.

+0

1 .: Я разверну свой вопрос, чтобы уточнить проблему с фрагментом/обзором 2 .: detach() не работает, поскольку, поскольку я заявил, что иерархия представления не должна быть уничтожена. – McFarlane

+0

@McFarlane Я думал, вы сказали, что не хотите, чтобы фрагмент был уничтожен. – yrazlik

+0

Вы правы, вопрос может быть истолкован по-разному. Я обновил его для уточнения. – McFarlane