Подтвердить что ты не робот

Как узнать, доступен ли фрагмент?

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

--- Edit ---

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

yourFragment.isResumed()

вместо

yourFragment.isVisible()

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

Ответ 4

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

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");
}

Ответ 5

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

Ответ 6

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

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

   super.setMenuVisibility(visible);
}

Ответ 7

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

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

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

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

Кажется, это трюк для меня.

Ответ 8

ArticleFragment articleFrag = (ArticleFragment)
            getSupportFragmentManager().findFragmentById(R.id.article_fragment);

    if (articleFrag != null && articleFrag.isVisible()) {

        // Call a method in the ArticleFragment to update its content
        articleFrag.updateArticleView(position);
    }

см. http://developer.android.com/training/basics/fragments/communicating.html