Ответ 1
Вы должны быть в состоянии сделать следующее:
MyFragmentClass test = (MyFragmentClass) getSupportFragmentManager().findFragmentByTag("testID");
if (test != null && test.isVisible()) {
//DO STUFF
}
else {
//Whatever
}
Я использую библиотеку поддержки v4, и мои вопросы: Как узнать, доступен ли фрагмент? и как я могу изменить прообразы макета, раздутого во Фрагменте? Спасибо заранее.
--- Edit ---
Я использую фрагменты, как в учебнике разработчиков Android с помощью функции FragmentActivity
Вы должны быть в состоянии сделать следующее:
MyFragmentClass test = (MyFragmentClass) getSupportFragmentManager().findFragmentByTag("testID");
if (test != null && test.isVisible()) {
//DO STUFF
}
else {
//Whatever
}
И isVisible()
и isAdded()
возвращают true
как только Fragment
создан, и даже не видны. Единственное решение, которое действительно работает:
if (isAdded() && isVisible() && getUserVisibleHint()) {
// ... do your thing
}
Это делает работу. Период.
Если вы хотите знать, когда используется просмотр фрагмента, вы должны использовать
yourFragment.isResumed()
вместо
yourFragment.isVisible()
Прежде всего isVisible()
уже проверяет на isAdded()
, поэтому нет необходимости вызывать оба. Во-вторых, не-из этих двух означает, что пользователь действительно видит ваш фрагмент. Только isResumed()
гарантирует, что ваш фрагмент находится перед пользователем, и пользователь может взаимодействовать с ним, если это то, что вы ищете.
вы можете попробовать следующим образом:
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");
}
getUserVisibleHint()
выполняется как истина только тогда, когда фрагмент находится в представлении и видимый
Вы можете переопределить setMenuVisibility следующим образом:
@Override
public void setMenuVisibility(final boolean visible) {
if (visible) {
//Do your stuff here
}
super.setMenuVisibility(visible);
}
Одна вещь, о которой нужно знать, заключается в том, что 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, если любой родительских фрагментов скрыты.
Кажется, это трюк для меня.
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