2016-08-10 4 views
1

Ich implementiere einen ViewPager mit FragmentStatePagerAdapter. Die Codebeispiele sind unten aufgeführt.Zugriff auf die Fragmentansicht bei der Änderung der Ausrichtung

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 ist wie folgt.

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

Im MainActivity, Ich versuche, die Orientierungsänderung zu behandeln. Ich benutze das folgende Stück Code.

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

} 

Die Fragmente werden auf Orientierungsänderung neu erstellt. onCreateView sowie onViewCreated werden aufgerufen (geprüft LogCat). Das Problem tritt auf, wenn ich versuche, die Ansicht in den Fragmenten zu aktualisieren. Für das Update verwende ich folgenden Code:

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

Aber wenn ich fragment1.getView() aufrufen, es kehrt null. Derselbe Code funktioniert jedoch gut, wenn ich die Ausrichtung nicht ändere.

Wie bekomme ich die Fragmentansichten zur Orientierungsänderung? Ich überprüfte einige der Lösungen, die dort gepostet wurden, um die Fragmente im Array zu speichern, aber diese funktionieren nicht für mich. Sind die Codes, die ich gestellt habe, nicht in der Lage, die Aufgabe zu erledigen? Vielen Dank.

Antwort

2

Solange Sie die Fragmente nicht aktualisieren (was nur bei einer Orientierungsänderung geschieht), wird Ihr Code ordnungsgemäß ausgeführt.

Ihr Aktualisierungscode gibt jedoch immer null für getView() zurück, da die Ansichten noch nicht erstellt wurden. instantiateItem() erstellt eine neue Fragment, wenn sie aufgerufen wird, die noch nicht zu Ihrer Anwendung hinzugefügt wurde und so alle Lebenszyklus-Callbacks (einschließlich onCreateView(...) und onViewCreated(...)) wurden noch nicht aufgerufen.

Aufgrund der Komplexität der korrekten Aktualisierung eines ViewPager Fragmente werde ich Sie auf eine ausgezeichnete existing answer beziehen. Sie finden auch weitere Details in this question.

Verwandte Themen