2016-08-10 8 views
1

Я реализую ViewPager, используя FragmentStatePagerAdapter. Ниже приведены примеры кода.Доступ к просмотру фрагмента при изменении ориентации

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 выглядит следующим образом.

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; 
    } 
} 

В MainActivity, я пытаюсь справиться с изменением ориентации. Я использую следующий фрагмент кода.

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); 

} 

Фрагменты воссозданы при изменении ориентации. onCreateView, а также onViewCreated вызывается (проверено 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(), она возвращается нуль. Тем не менее, тот же код работает хорошо, когда я не меняю ориентацию.

Как я могу получить вид фрагмента при изменении ориентации? Я проверил некоторые из опубликованных решений, где они говорят, чтобы сохранить фрагменты в массиве, но они не работают для меня. Являются ли коды, которые я поставил, не в состоянии выполнить задачу? Спасибо.

ответ

2

Пока вы не обновляете фрагменты (что происходит только при изменении ориентации), ваш код будет работать нормально.

Однако код обновления всегда будет возвращать null для getView(), так как виды еще не созданы. instantiateItem() создаст новый Fragment при вызове, который еще не добавлен в ваше приложение, и такие все обратные вызовы жизненного цикла (включая onCreateView(...) и onViewCreated(...)) еще не были вызваны.

Из-за сложности правильного обновления фрагментов ViewPager я приведу вам отличный existing answer. Вы также можете найти более подробную информацию в this question.

Смежные вопросы