6

Mam ViewPager z dwoma Fragments, które utworzę w onCreate mojego FragmentActivity.Android - Viewpager i fragmenty, metody nie działają

private List<Fragment> fragments = new Vector<Fragment>(); 

fragments.add(Fragment.instantiate(this,Frag_1.class.getName())); 
fragments.add(Fragment.instantiate(this,Frag_2.class.getName())); 
    this.vPagerAdapter = new Adapt(super.getSupportFragmentManager(),fragments); 
    vPager = (ViewPager) super.findViewById(R.id.pager); 
    vPager.setAdapter(vPagerAdapter); 

mój drugi Fragment ma metodę wewnątrz tego wezwania I zaktualizować ListView - refreshList():

public class Frag_2 extends Fragment { 

    private ListView list; 
    private ArrayList<data> data; 
    private boolean firstCreation=true; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.setRetainInstance(false); 
    } 

    public void onAttach(Activity activity) { 
     // TODO Auto-generated method stub 
     super.onAttach(activity); 
    } 

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

     View view = inflater.inflate(R.layout.layout, container, false); 
     list = (ListView) view.findViewById(R.id.lst); 
     //this.setRetainInstance(true); 
     return view; 
    } 


    public void refreshList(ArrayList <data> data){ 
     if(data!=null){ 
      ArrayAdapter<data> adapter = new Item_data_adapter(getActivity(),data); 
      list.setAdapter(adapter);} 
    } 
} 

Called z mojego FragmentActivity

//Something 
Frag_2 fr = (Frag_2) vPagerAdapter.getItem(1); 
if (fr.getView() != null) { 
    fr.refreshList(data); 
} 

To działa dobrze, dopóki nie zmieni orientację ekranu. Popraw mnie, jeśli się mylę, ale szukałem godzin i nie znalazłem rozwiązania lub dobrego wyjaśnienia, FragmentActivity jest tworzony tylko jeden raz i Fragments są dołączone do niego, ale Fragments odtworzyć na zmiany konfiguracji. Teraz, gdy zmiana orientacji nie dostaję View od onCreate, więc kiedy próbuję uzyskać View z Fragment zwraca ona null i moja metoda refreshList() nie jest wywoływana. Jak mogę to naprawić?

+0

Nikt nie wie jak to zrobić? – DLock

+0

Mam ten sam problem i nie znalazłem rozwiązania. Zaczynam myśleć, że jest jakiś błąd w 'FragmentManager' lub coś innego, ponieważ oboje tego doświadczamy. – adneal

+0

co z układem xml? nie jest to problemem dla statycznych fragmentów zadeklarowanych w układzie działania, ale tak nie jest w przypadku fragmentów dynamicznych. – chip

Odpowiedz

1

I problem został rozwiązany w ten sposób: W onCreate z FragmentActivity

if(savedInstanceState!=null){ 
      frag1 = (frag_1) getSupportFragmentManager().getFragment(savedInstanceState, frag_1.class.getName()); 
      frag2 = (frag_2) getSupportFragmentManager().getFragment(savedInstanceState, frag_2.class.getName()); 
     } 
     else{ 
      frag1 = (frag_1) Fragment.instantiate(this,frag_1.class.getName()); 
      frag2 = (frag_2) Fragment.instantiate(this,frag_2.class.getName()); 
     } 
     fragments.add(frag1); 
     fragments.add(frag2); 


protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     getSupportFragmentManager().putFragment(outState, frag_1.class.getName(), frag1); 
     getSupportFragmentManager().putFragment(outState, frag_2.class.getName(), frag2); 
    } 

Może to nie jest najlepsze rozwiązanie we wszechświecie, ale wygląda na to, że działa ...

+0

To działa, również dostosowując 'configChanges' w Manifest działa, ale nie sądzę, że są to stałe rozwiązania. Przypuszczam, że ten sposób zadziałałby w przypadku, gdy masz jeden lub dwa "Fragmenty", ale faktycznie mam pięć, które są przez to realizowane. Cieszę się, że to działa dla ciebie. – adneal

-1

Jeśli używasz fragmentu dynamicznego, musisz najpierw przetestować, aby zapobiec tworzeniu drugiej instancji fragmentu.

Aby sprawdzić, czy system ponownie tworzy aktywność, sprawdź, czy argument Pakiety przekazany do działania użytkownika jest onCreate() pod numerem null.

Jeśli nie jest to null, system ponownie tworzy aktywność. W tym przypadku działanie automatycznie ponownie tworzy instancje istniejących fragmentów .

Jeśli jest to null, możesz bezpiecznie utworzyć dynamiczny fragment. Np

public void onCreate(Bundle savedInstanceState) { 
    // ... 
    if (savedInstanceState != null) { 
    FragmentManager fragmentManager = getFragmentManager() 
    // Or: FragmentManager fragmentManager = getSupportFragmentManager() 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    ExampleFragment fragment = new ExampleFragment(); 
    fragmentTransaction.add(R.id.fragment_container, fragment); 
    fragmentTransaction.commit(); 
    } 
} 

Klasa Fragment obsługuje metodę onSaveInstanceState(Bundle) (ale nie w sposób onRestoreInstanceState()) w taki sam sposób, jak w kategorii aktywności.

  • Domyślna implementacja zapisuje stan wszystkich widoków fragmentów, które mają identyfikatory.
  • Można zastąpić tę metodę, aby przechowywać dodatkowe informacje o stanie fragmentu.
  • Jeśli system ponownie tworzy fragment z poprzedniego zapisanego stanu, zawiera odniesienie do Bundle zawierającego ten stan metodami: , onCreateView() i onActivityCreated(); w przeciwnym razie argument jest ustawiony na null.

Jeśli chcesz szczegółowe informacje, here's dobrą rozmowę Ken Jones z Marakana

+0

Ta odpowiedź nie dotyczy pytania. @DLock i ja nie używamy 'FragmentTransaction' ani statycznych' Fragmentów' w naszym XML. Używamy 'ViewPager', który wywołuje' FragmentPagerAdapter'. – adneal

0

Kiedy u chcą, aby odświeżyć listę zrobić coś takiego:

public void setView() { 
    Frag_2 fr = (Frag_2) vPagerAdapter.getItem(1); 
    fragmentManager.beginTransaction().detach(fr).commit(); 
    fragmentManager.beginTransaction().attach(fr).commit(); 
} 
Powiązane problemy