2016-05-10 12 views
0

Ich hatte einen FragmentPagerAdapter erstellt, um viele Fragen mit demselben Fragment anzuzeigen.Zustand des Fragments mit FragmentPagerAdapter speichern

Dies ist das Fragment:

QuestionFragment

Wenn Antwort geben und zu validieren, ich deaktivieren Taste und EditText. Aber wenn ich zwei Fragmente gleiten lasse und zurückkomme, sind EditText und Button nicht mehr deaktiviert und der Benutzer kann den Wert des Bearbeitungstextes ändern.

Dies ist FragmentPagerAdapter:

/** 
    * A simple {@link Fragment} subclass. 
    */ 
    public class PlayFragment extends FragmentPagerAdapter { 

     //--Jouer un circuit 
     private static Game currentGame = null; //La partie courante 
     public static Circuit circ; 
     private static List<QuestionReponse> questionsReponses = new ArrayList<>(); 

     private int PAGE_COUNT; 
     private static ArrayList<String> listTitles = new ArrayList<>(); 

     public PlayFragment(FragmentManager fm) { 
      super(fm); 
      this.listTitles = new ArrayList<>(); 
      for (int i = 0; i < currentGame.getDifficulties().size(); i++) { 
       this.listTitles.add(currentGame.getDifficulties().get(i).getName()); //Les difficultées choisis 
      } 
      this.PAGE_COUNT = currentGame.getDifficulties().size(); 
     } 


     @Override 
     public int getCount() { 
      return PAGE_COUNT; 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return QuestionFragment.newInstance(position + 1); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      // Generate title based on item position 
      return listTitles.get(position); 
     } 

     public static Game getCurrentGame() { 
      return currentGame; 
     } 

     public static void setCurrentGame(Game currentGame) { 
      PlayFragment.currentGame = currentGame; 
     } 


     public static ArrayList<String> getListTitles() { 
      return listTitles; 
     } 

     public static void setListTitles(ArrayList<String> listTitles) { 
      PlayFragment.listTitles = listTitles; 
     } 
    } 

Dies ist StartGameFragment:

/** 
* A simple {@link Fragment} subclass. 
*/ 
public class StartGameFragment extends Fragment implements AsyncResponse { 

    PlayFragment playFragment; 

    public StartGameFragment() { 
     // Required empty public constructor 
    } 


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

     ((MainActivity) getActivity()).changeActionBarTitle(getString(R.string.nav_circuit_dl)); 
     MenuItem item = ((MainActivity) getActivity()).navigationView.getMenu().findItem(R.id.nav_dl_circuit); 
     if (item != null) item.setChecked(true); 

     //Allow to modify ActionBar menu in this fragment 
     setHasOptionsMenu(true); 
     //new JSONGetter().execute(""); 
     // Inflate the layout for this fragment 
     View v = inflater.inflate(R.layout.fragment_start_game, container, false); 

     ViewPager viewPager = (ViewPager) v.findViewById(R.id.viewpager); 
     this.playFragment = new PlayFragment(getActivity().getSupportFragmentManager()); 
     viewPager.setAdapter(playFragment); 

     // Give the TabLayout the ViewPager 
     TabLayout tabLayout = (TabLayout) v.findViewById(R.id.sliding_tabs); 
     tabLayout.setupWithViewPager(viewPager); 
     return v; 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     menu.clear(); 
    } 


    @Override 
    public void onDestroyView() { 
     MenuItem item = ((MainActivity) getActivity()).navigationView.getMenu().findItem(R.id.nav_dl_circuit); 
     if (item != null) item.setChecked(false); 
     super.onDestroyView(); 
    } 

    @Override 
    public void onTaskDBCompleted(String result, Object entity, String method) { 

    } 

    @Override 
    public void onTaskCompleted(String result, String method) { 

    } 
} 

Und schließlich QuestionFragment (I zeigen nicht alle, weil zu viel Code in diesem Fragment):

/** 
* A simple {@link Fragment} subclass. 
*/ 
public class QuestionFragment extends Fragment implements AsyncResponse { 

    public QuestionFragment() { 
     // Required empty public constructor 
    } 


    public static QuestionFragment newInstance(int page) { 
     Bundle args = new Bundle(); 
     args.putInt(ARG_PAGE, page); 
     QuestionFragment fragment = new QuestionFragment(); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mPage = getArguments().getInt(ARG_PAGE); 
    } 
} 

Ich versuchte mit this solution, aber das funktioniert nicht für mich!

+0

Warum funktioniert es nicht für Sie? Wie haben Sie es umgesetzt? Gib uns etwas Code. – Sevle

+0

Ich bearbeitete meine Frage :) – Eraseth

Antwort

0

// Speichern Sie Ihre Zustände hier in Ihrem Fragment

@Override 
protected void onSaveInstanceState(Bundle savedInstanceState) { 
// TODO Auto-generated method stub 
super.onSaveInstanceState(outState); 

String stateToSave = edittextEditState.getText().toString(); 
savedInstanceState.putString("saved_state", stateToSave); 
} 

} 

// die Daten abrufen

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
if(savedInstanceState != null) { 
Toast.makeText(this, savedInstanceState .getString("saved_state"),Toast.LENGTH_LONG).show(); 
} 
} 
1

In der v4-Unterstützungsbibliothek ist ein weiterer Adapter verfügbar genannt FragmentStatePagerAdapter.

Es speichert standardmäßig den internen Zustand von Fragmenten. Sie können die Methoden saveState() und restoreState() überschreiben, um benutzerdefinierte Statusdaten zu speichern/wiederherzustellen.

Verwandte Themen