2013-05-20 2 views
26

Я использую библиотеку поддержки v4, и мои вопросы: Как узнать, доступен ли фрагмент? и как я могу изменить прообразы макета, раздутого во Фрагменте? Заранее спасибо.Как узнать, доступен ли фрагмент?

--- Edit ---

Я использую фрагменты, как в андроид разработчиков учебник с FragmentActivity

+0

http://developer.android.com/reference/android/app/Fragment.html#isVisible() – Tarun

+1

Решение, которое сработало лучше всего для меня, было http://stackoverflow.com/a/6751537/1816603 –

ответ

49

Вы должны быть в состоянии сделать следующее :

MyFragmentClass test = (MyFragmentClass) getSupportFragmentManager().findFragmentByTag("testID"); 
if (test != null && test.isVisible()) { 
    //DO STUFF 
} 
else { 
    //Whatever 
} 
+6

На самом деле это будет 'test! = Null && test.isVisible()' иначе, когда тест будет null, он будет бросать 'NullPointerException' – Axxiss

+0

@Axxiss Спасибо, я забыл об этом, я сделал это как два разных, если в моем коде, но просто изменил его для простоты здесь. Подумайте об этом ... Мне следовало бы пойти на изменение, что в моем коде ... – TronicZomB

+1

Спасибо. Это то же самое, что и выше, и оно работает. –

6

Вы можете переопределить setMenuVisibility следующим образом:

@Override 
public void setMenuVisibility(final boolean visible) { 
    if (visible) { 
     //Do your stuff here 
    } 

    super.setMenuVisibility(visible); 
} 
+0

Большое спасибо, что функция с этим именем может дать такую ​​функциональность, я много искал об этой проблеме, большое вам спасибо. – EyadMhanna

+0

Отличная функция/трюк! Благодаря! Экономит много времени. – cdkn7

3

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

isVisible() является окончательным, поэтому, к сожалению, он не может быть отменен. Мой обходной путь был создать BaseFragment класс, что все мои фрагменты продлить, а затем создать метод следующим образом:

public boolean getIsVisible() 
{ 
    if (getParentFragment() != null && getParentFragment() instanceof BaseFragment) 
    { 
     return isVisible() && ((BaseFragment) getParentFragment()).getIsVisible(); 
    } 
    else 
    { 
     return isVisible(); 
    } 
} 

я isVisible() && ((BaseFragment) getParentFragment()).getIsVisible();, потому что мы хотим, чтобы вернуться ложным, если любой родительских фрагментов скрыты.

Это похоже на трюк для меня.

+0

Спасибо! Потратил 2 часа, почесывая мою голову над этим. – fhucho

+0

Что делать, если родительский фрагмент виден, но вложенный фрагмент, для которого он проверяет, не отображается? .. Как мы проверяем такой сценарий? – leoOrion

9

getUserVisibleHint() приходит как верно только тогда, когда фрагмент на представлении и видимой

+0

В моем случае каждый фрагмент возвращает 'getUserVisibleHint()' is true –

8

вы можете попробовать этот способ:

Fragment currentFragment = getFragmentManager().findFragmentById(R.id.fragment_container); 

или

Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container); 

В этом случае, вы убедитесь, currentFragment является экземпляром YourFragment

if (currentFragment instanceof YourFragment) { 
    Log.v(TAG, "your Fragment is Visible"); 
} 
3

Оба isVisible() и isAdded() возвращают true, как только Fragment создан и даже не отображается на самом деле. Единственным решением, которое фактически работает, является:

if (isAdded() && isVisible() && getUserVisibleHint()) { 
    ... do your thing 
} 

Это делает работу. Период.

+0

Я провожу много времени только для этого getUserVisibleHint() THX – Ares91

6

Если вы хотите знать, когда использование смотрит на фрагмент, вы должны использовать

yourFragment.isResumed() 

вместо

yourFragment.isVisible() 

Прежде всего isVisible() уже проверяет isAdded() поэтому нет необходимости для вызова обоих. Во-вторых, не-из этих двух означает, что пользователь действительно видит ваш фрагмент. Только isResumed() гарантирует, что ваш фрагмент находится перед пользователем, и пользователь может взаимодействовать с ним, если это то, что вы ищете.

+1

Красивый ответ и объяснение, +1 миллион раз, если бы я мог –

+1

Это не работает. Это дает мне истинное значение для всех вкладок evn, хотя только один из них используется и виден. – leoOrion

+0

Кажется, что не работает. isResumed по-прежнему возвращает «true», даже фрагмент находится в фоновом стеке и вообще не отображается. Я проверил 'isResumed' на методе onPrepareOptionsMenu, и я использую getChildFragmentManager для дочерних фрагментов в представлении пейджера. – wonsuc

Смежные вопросы