2013-07-09 5 views
2
public class MyFragment extends Fragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 

     if (?) { 
      ... handle ... 
     } 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 

     if (?) { 
      ... handle ... 
     } 
    } 
} 

Hi. Я пытаюсь поиграть с сохранившимся фрагментом, который должен обрабатывать некоторые вещи во время onResume() и onPause(). Я добавил это к основной деятельности, и до сих пор он отлично работает, за исключением одного. Если я введу другое действие в приложение, скажем, настройки приложения, этот фрагмент все равно будет выполняться onResume и onPause после переключения экрана.Проверить состояние жизненного цикла

Что мне нужно, это выяснить, работает ли этот фрагмент, не на переднем плане. Я пробовал такие вещи, как isTaskRoot, но он вернет true, пока эти методы жизненного цикла выполняются. Теперь, если Android знает, чтобы этот фрагмент был приостановлен после запуска onResume, тогда должен быть способ проверить это из метода onResume?

ответ

2

Деятельность становится неотправленной, когда вызывается ее onPause(). Деятельность становится передним, когда вызывается ее onResume().

http://developer.android.com/guide/components/activities.html#Lifecycle

Один из способов узнать

ли деятельность, что этот фрагмент присоединен к, не в переднем плане

должен иметь активность, чтобы установить isForeground = false в методе деятельности onPause() и установить isForeground = true в методе деятельности onResume() и сделать это флаг доступен для фрагмента через интерфейс обратного вызова, аналогичный значению described here. Единственное различие заключается в том, чтобы вместо этого передавать события фрагмента в Activity, фрагмент будет считывать состояние активности (например, SomeInterface.getForeground()).

Другим способом является определение общедоступного метода MyFragment.setForeground(boolean foreground) и активизация этого метода с его методов onPause() и onResume().

+0

Что мне нужно, это знать из фрагментов onResume, если оно действительно возобновляется или нет. Как я уже сказал, если я изменю активность на свою активность в настройках, то onResume будет вызываться во фрагменте, принадлежащем основному действию, даже если это НЕ то действие, в котором я сейчас живу. В этих случаях я не должен ничего выполнять в либо возобновить или приостановить, потому что фрагмент действительно не возобновляется. Я не знаю, почему они даже называются, когда активность находится в фоновом режиме, но в любом случае мне нужен способ рассказать в рамках собственных обратных вызовов фрагментов. –

+0

Давайте посмотрим на второй подход. MainActivity.onPause() вызывает MyFragment.setForeground (false), который установит значение MyFragment.isParentInForeground в false. Затем MyFragment.onResume() может проверить, является ли isParentInForeground истинным или ложным, и принять решение. Кстати, действительно странно, что MyFragment.onPause/onResume вызывается, когда фрагмент находится в фоновом режиме :( – Y2i

+0

Я не могу использовать Activity. Это небольшая библиотека, которая вставляет фрагмент в любую активность, где я могу этого захотеть. Я думаю, что обратные вызовы вызываются из-за состояния Retain Instance. Что мне кажется более странным, так это то, что если я выполню класс и проанализирую фрагмент «this» в моем onResume(), а в фоновом режиме, то Fragment.getActivity() будет null в вызываемом классе, но если я вызову getActivity() из метода onResume(), это не так. Если бы это было так, я мог бы просто использовать это, чтобы проверить текущее состояние. –

1

Просто используйте функцию Activity hasWindowFocus(). Это сработало для меня. И вы можете использовать его, чтобы установить флаг для завершения действия для того, когда операция вернется к фокусу и отметьте флаг в onResume().

+0

Не совсем ответ на вопрос, но это сработало для меня, когда я не хотел делать что-то в активности, которая не была текущей, и я не мог отслеживать состояние в хост-приложении, так как я его не владею. –

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