2016-09-16 132 views
4

我一直在做一個片段的setUserVisibleHint()方法中的一些邏輯。我總是檢查isVisibleToUser是否爲真,然後使用getActivity返回活動。在我將支持庫更新到最新版本(support:appcompat-v7:24.2.0)之前,這一切都運行良好(100%的時間)。現在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

據谷歌稱:「此前的Androidñ有一個平臺漏洞,可能導致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 
    } 
} 
相關問題