2016-08-10 9 views
1

私はFragmentStatePagerAdapterを使用してViewPagerを実装しています。コードサンプルは以下の通りです。次のように方向変更のフラグメントビューへのアクセス

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 

    public ScreenSlidePagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 

     Log.d("--GetItem", "---"); 

     switch (position) { 

      case 0: 
       return ScreenSlidePageFragment.newInstance(b1); 
      case 1: 
       return ScreenSlidePageFragment.newInstance(b2); 
      case 2: 
       return ScreenSlidePageFragment.newInstance(b3); 
      default: 
       return null; 
     } 

    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Log.d("--InstItem", "--"); 
     return super.instantiateItem(container, position); 

    } 

    @Override 
    public int getCount() { 
     return NUM_PAGES; //set as 3 
    } 


} 

ScreenSlidePageFragmentです。 MainActivity

public class ScreenSlidePageFragment extends Fragment implements View.OnClickListener{ 


    Bundle b; 

    public ScreenSlidePageFragment() { 

    } 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     Log.d("----onCreateFrgmnt--", "11"); 

     super.onCreate(savedInstanceState); 



    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     Log.d("----onCreateViewFrgmnt-", "11"); 

     ViewGroup rootView = (ViewGroup) inflater.inflate(
       R.layout.fragment_screen_slide_page, container, false); 

     return rootView; 

    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 

     super.onViewCreated(view, savedInstanceState); 

     Log.d("----onViewCreatedFrgmnt", "11"); 


     b = getArguments(); 

     TextView tv_city = (TextView) view.findViewById(R.id.city_field); 
     TextView tv_update = (TextView) view.findViewById(R.id.updated_field); 
     TextView tv_day = (TextView) view.findViewById(R.id.day); 

     tv_day.setText("DAY " + String.valueOf(b.getInt("day"))); 
     tv_city.setText(b.getString("city")); 

     tv_update.setText("Last update on : " + b.getString("date")); 

    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

    } 

    public static ScreenSlidePageFragment newInstance(Bundle myBundle) { 

     ScreenSlidePageFragment f = new ScreenSlidePageFragment(); 
     f.setArguments(myBundle); 
     return f; 
    } 
} 

、私は姿勢の変化に対応しようとしています。私は以下のコードを使用します。

if (savedInstanceState != null) { 

    setContentView(R.layout.activity_main); 

    myViewPager = (MyCustomViewPager) findViewById(R.id.pager); 


    b1 = savedInstanceState.getBundle("Fragment1"); 
    b2 = savedInstanceState.getBundle("Fragment2"); 
    b3 = savedInstanceState.getBundle("Fragment3"); 



    myViewPager.setOffscreenPageLimit(NUM_PAGES - 1); 

    myPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); 

    myViewPager.setAdapter(myPagerAdapter); 

} 

これらのフラグメントは、配向の変化によって再作成されます。 onCreateViewonViewCreatedが呼び出されています(Check LogCat)。この問題は、フラグメント内のビューを更新しようとすると発生します。更新のために私は次のコードを使用しています:

FragmentStatePagerAdapter adapter = (FragmentStatePagerAdapter) myViewPager.getAdapter(); 

ScreenSlidePageFragment fragment1 = (ScreenSlidePageFragment) adapter.instantiateItem(myViewPager, 0); 
ScreenSlidePageFragment fragment2 = (ScreenSlidePageFragment) adapter.instantiateItem(myViewPager, 1); 
ScreenSlidePageFragment fragment3 = (ScreenSlidePageFragment) adapter.instantiateItem(myViewPager, 2); 

をしかし、私はfragment1.getView()呼び出すとき、それはnullを返しています。ただし、向きを変更しないと、同じコードがうまく実行されます。

方向変更に関するフラグメントビューを取得するにはどうすればよいですか?私はいくつかのソリューションをチェックして、断片をアレイに保存すると言ったところに投稿しましたが、それらは私のために働いていません。私が書いたコードは、タスクを実行することはできませんか?ありがとうございました。

答えて

2

フラグメントを更新しない限り(オリエンテーションの変更でのみ発生する)、コードは正常に動作します。

ただし、更新コードは、まだビューが作成されていないため、getView()の場合はnullを返します。 instantiateItem()は、アプリケーションにまだ追加されていない新しいFragmentを作成し、ライフサイクルコールバック(onCreateView(...)およびonViewCreated(...)を含む)がまだ呼び出されていません。

ViewPagerの断片を正しく更新することの複雑さのため、私はあなたに素晴らしいexisting answerを紹介します。 this questionで詳細を確認することもできます。

関連する問題