2012-05-07 31 views
5

私は、メインフラグメントとリストフラグメントの2つのフラグメントを含むViewPagerを持つアプリケーションを持っています。リスト内の何かが選択されると、アクティビティで処理されるイベントが発生します。アクティビティはメインフラグメントに切り替わり、 "setSelectedItem"メソッドを呼び出します。このメソッドでは、 私は選択された項目に従ってテキストを変更する特定のビューを見つけるためにgetView()を使用します。フラグメント内のgetViewがnullを返す場合があります

ほとんどの場合、動作しますが、時にはgetViewがnullを返し、なぜそれがわかりません。

pagerAdapterが活動のOnCreateの中に作成されます。

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

ページャアダプタはそのコンストラクタで両断片のインスタンスを作成:

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

とこれはと呼ばれる活動の方法であり、リストから項目が選択されたとき:

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

フラグメントマネージャーにフラグメントを追加するコードを共有できますか? onCreateView(フラグメントライフサイクルの一部)がフラグメントに対して呼び出されていない場合、つまりフラグメントがアクティビティに完全に追加されていない場合、getViewはnullを返す可能性があります。 – PacificSky

+0

"TextView s"はどこで呼びますか?これは公開されていますか? –

答えて

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

トピックはかなり古く、まだ受け入れられていません。同じ問題があり、解決策を探しています。アンドロイドがホスティング活動を殺したとき(例えばmemの外で).Androidはこの場合に活動を再開しようとします。何らかの理由で、onCreateViewは、フラグメントレコーディングの後に呼び出されるのではなく、before(!)という名前で呼び出されます。問題を確実に再現するには、 'developer options'に'アプリをホームボタンを押して復元します。 – undefined

関連する問題