2016-09-16 4 views
4

Я делал некоторую логику внутри метода setUserVisibleHint() фрагмента. Я всегда проверял, верно ли значение isVisibleToUser, а затем используется getActivity, чтобы вернуть активность. Это работало хорошо (100% времени), пока я не обновил библиотеку поддержки до последней (support:appcompat-v7:24.2.0). Теперь getActivity всегда возвращает null. Есть ли некоторые изменения в библиотеке поддержки, которые объясняют это поведение?Фрагмент setuserVisibleHint true, но getActivity возвращает null

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(false); 

    if (isVisibleToUser) { 
     getActivity() <- null 
    } 
+0

показать свой код? –

+0

@KaveeshKanwal done – noev

+0

@noev вы можете сохранить значение контекста из функции ** onAttach **. –

ответ

2

Ниже Работал для меня ....

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) 
{ 
    //// create class member variable to store view 
    viewFrag =inflater.inflate(R.layout.fragment_main_favorite, container, false); 

    // Inflate the layout for this fragment 
    return viewFrag; 
} 

и использовать этот

@Override 
    public void setUserVisibleHint(boolean visible) 
    { 
     super.setUserVisibleHint(visible); 


      if (visible) 
      { 

       View v = viewFrag ; 
       if (v == null) { 
        Toast.makeText(getActivity(), "ERROR ", Toast.LENGTH_LONG).show(); 
        return; 
       } 
      } 

    } 
2

Согласно Google: «До Android N была платформа ошибка, которая может привести к setUserVisibleHint чтобы довести фрагмент до начального состояния до того, как было совершено его FragmentTransaction. Поскольку некоторые приложения полагались на это поведение, оно сохраняется для приложений, объявляющих targetSdkVersion 23 или ниже ».

Итак, возможны два варианта: 1. перестроить с помощью targetSdkVersion < 24; 2. изменить приложение в соответствии с новой ситуацией => использовать контекст вне этого обратного вызова, соответственно, в методе onAttach или позже в жизненном цикле фрагмента;

0
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
    if (isVisibleToUser && (getActivity()!=null)) { 
    getActivity(); 
    } 
} 

на первый обед getActivity() обнуляемым

1

Я немного опоздал на вечеринку, но, возможно, это может помочь кому-то. Я решил эту проблему, создав логический элемент внутри класса фрагмента. Затем я использовал это, чтобы определить, удалось ли мне успешно получить активность в методе setUserVisibleHint. Если нет, я выполняю код, связанный с деятельностью, в onAttach. Смотри ниже.

public MyFragment extends Fragment { 

    ... 

    private boolean doInOnAttach = false; 

    @Override 
    public void setUserVisibleHint(boolean visible) { 
     super.setUserVisibleHint(visible); 
     // if the fragment is visible 
     if (true == visible) { 
      // ... but the activity has not yet been initialized 
      doInOnAttach = true; 
     } else { 
      myAction(); 
     } 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (true == doInOnAttach) { 
      myAction(); 
      doInOnAttach = false; 
     } 
    } 

    private void myAction() { 
     // code to execute here 
    } 
} 
Смежные вопросы