2012-05-07 44 views
5

我有一個ViewPager應用程序,它包含兩個片段:主片段和列表片段。如果列表中的某些內容被選中,則會引發活動中處理的事件。活動切換到主片段並調用「setSelectedItem」方法。在這個方法中, 我使用getView()來查找特定視圖,以根據所選項目更改文本。getView中的片段返回有時爲空

大部分時間它的工作,但有時getView返回null,我不知道爲什麼。

的pagerAdapter在活動的OnCreate中創建的:

public PagerAdapter(FragmentManager fm) { 
    super(fm); 
    this.main = MainFragment.newInstance(); 
    this.list = ListFragment.newInstance(); 
} 

這是活性的方法,該方法被稱爲:

this.mPagerAdapter = new PagerAdapter(super.getSupportFragmentManager()); 
ViewPager pager = (ViewPager)super.findViewById(R.id.viewpager); 
pager.setAdapter(this.mPagerAdapter); 

尋呼機適配器在其構造產生兩個片段的情況下當從列表中選擇一個項目時:

ViewPager pager = (ViewPager)super.findViewById(R.id.viewpager); 
pager.setCurrentItem(0, true); 
((MainFragment)mPagerAdapter.getItem(0)).setSelectedItem(id); 

最後th是在MainFragment在setSelectedItem方法行導致該問題:

TextView s = (TextView)getView().findViewById(R.id.CurrentSelection); 

我試過幾件事情我瞭解,但問題仍然存在不規則。

+0

不幸的是,我有同樣的問題,並沒有解決方案。我的代碼亂七八糟if(getView()== null)return;在各個地方。如果你現在已經解決了這個問題,我會很感興趣。 – StackOverflowed

+2

您可以分享將片段添加到fragmentmanager的代碼嗎?如果沒有爲片段調用onCreateView(片段生命週期的一部分),getView將返回null - 即片段尚未完全添加到活動中。 – PacificSky

+0

你在哪裏調用「TextView s」?這是在公共視圖getView在片段? –

回答

0

首先,我不是100%確定的,但我有幾點需要提及。首先,我不喜歡你如何使用thissuper這樣的,他們似乎是模糊的,我相信一個更好的方法是更準確的考慮預編譯你知道它們的價值。我認爲如果您將代碼更改爲以下內容,這將有所幫助(僅僅是一種預感)。

// No need for 'this' and 'super' here, you are within the activity 
mPagerAdapter = new PagerAdapter(getSupportFragmentManager()); 
ViewPager pager = (ViewPager)findViewById(R.id.viewpager); 
pager.setAdapter(mPagerAdapter); 

public PagerAdapter(FragmentManager fm) { 
    super(fm); 
    // No need for 'this' here, you are within the class 
    main = MainFragment.newInstance(); 
    list = ListFragment.newInstance(); 
} 

// No need for 'super' here, you are within the activity 
ViewPager pager = (ViewPager)findViewById(R.id.viewpager); 
pager.setCurrentItem(0, true); 
((MainFragment)mPagerAdapter.getItem(0)).setSelectedItem(id); 

// Here use 'getActivity()' instead of 'getView()' 
TextView s = (TextView)getActivity().findViewById(R.id.CurrentSelection); 

讓我知道發生了什麼,歡呼聲。

+0

這個話題是相當古老的,仍然沒有被接受的答案。有同樣的問題和尋找解決方案。一個重要的通知:問題是repro當android殺死託管活動(例如在mem之外).Android在這種情況下嘗試重新啓動活動。出於某種原因,onCreateView在片段重新創建後不會被調用,而是在before(!)之前調用。爲了確實重現問題,可以設置'用戶離開後立即銷燬每個活動'到'開發人員選項'中。然後,只需暫停按回家按鈕並恢復它。 – undefined