Во фрагменте, как бороться с отдельной деятельностью? - PullRequest
0 голосов
/ 11 января 2019

Я все еще озадачен тем фактом, что Google добавляет метод в API Android, который иногда работает, а иногда нет; а именно Fragment.getActivity(). Я знаю, я могу проверить, если результат null, а также есть метод isAdded(). Тем не менее, как мне поступить, если эти проверки имеют отрицательный результат? Когда я зашел так далеко, есть причина, по которой я хочу получить доступ к Activity, например, получить доступ к Resources или Preferences или сделать одну из миллиарда вещей, для которых в Android требуется Context.

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

Или я мог бы рассказать пользователю об отключенном действии и что он должен повторить попытку позже. Но подождите, Toast требуется Context, поэтому я даже не могу этого сделать.

Или я должен просто подождать, пока действие будет прикреплено вот так?

Activity activity = getActivity();

while (activity == null) {
    Thread.sleep(10);
    activity = getActivity();
}

(я не всерьез предлагаю это, я просто хочу показать, насколько я в отчаянии)

Может быть, я думаю об этом все неправильно. Может быть, я пытаюсь делать вещи неправильно. Может быть, есть школа мысли о том, как использовать фрагменты, о которых я не слышал. Однако, если мне следует избегать доступа к Activity в Fragment, почему метод getActivity() вообще существует?

Особая проблема, с которой я сейчас борюсь, заключается в том, что в PreferenceFragment в OnSharedPreferenceChangeListener я хочу дать пользователю Toast сообщение:

Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show();

Это работает большую часть времени, но иногда дает сбой, потому что getActivity() вернул null.

Ответы [ 2 ]

0 голосов
/ 13 января 2019

В обычных случаях после присоединения у вас всегда будет активность во фрагменте, поскольку активность будет отсоединена только после того, как фрагмент будет уничтожен (и никогда не будет повторно присоединен). См. График жизненного цикла фрагмента с Android на https://developer.android.com/guide/components/fragments. Единственная проблема, о которой я могу думать, это когда вы используете другой поток или публикуете Runnable с обратным вызовом, ссылающимся на Fragment. В этом случае обратный вызов может быть вызван после того, как Fragment отсоединен и уничтожен. Теперь, обычно в этом случае, вы хотите сбросить то, что вы делаете, и выйти, поэтому просто проверьте, имеет ли getActivity значение null, и ничего не делайте. Если вам действительно нужно что-то делать, даже если Fragment уничтожен, тогда, если вам нужен контекст только для ресурсов или чего-то подобного, вы можете безопасно использовать ApplicationContext, который вы можете безопасно хранить в течение всей жизни приложения. Если вам нужен контекст для пользовательского интерфейса, например, чтобы показать пользователю тост, ApplicationContext не будет работать. В этом случае вам придется переделать свой код, так что Activity - это тот, который имеет дело с обратными вызовами и функциями, а не Fragment. Это все при условии, что активность все еще будет.

0 голосов
/ 11 января 2019

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

  YourActivity mContext; 

, а затем переопределите это в своем фрагменте

@Override
public void onAttach(Context context) {
    mContext = (YourActivity) context;
    super.onAttach(context);
}

и используйте mContext вместо getActivity ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...