Я бы подумал о том, что пользовательский объект хранит данные, заполняемые каждым фрагментом. Что-то вроде:
public class FillerData implements Parcelable {
private String page0$data0;
private String page0$data1;
private String page0$data2;
// getters and setters if you wish
// implement Parcelable interface as this object will be managed by host activity
}
Вы будете иметь только один такой объект управляется родительской деятельности и родительская деятельность будет реализовать интерфейс для раскрытия этого объекта:
public static interface FillerDataExposer {
public FillerData exposeFiller();
}
public class MyFragmentHostActivity extends FragmentActivity implements FillerDataExposer {
private static final String FILLER_KEY = "FILLER_KEY";
private FillerData myFillerData;
protected void onCreate(Bundle savedInstance) {
.......
if(savedInstance != null) {
myFillerData = (FillerData) savedInstance.getParcelable(FILLER_KEY);
} else {
myFillerData = new FillerData();
}
}
protected void onSaveInstanceState(Bundle savedInstance) {
super.onSaveInstanceState();
savedInstance.putExtra(FILLER_KEY, myFillerData);
}
public FillerData exposeFiller() {
return this.myFillerData;
}
}
Теперь каждый из ваших фрагментов будет иметь доступ к этому централизованному объекту наполнителя данных через родительскую активность.Для того, чтобы уменьшить вес вашего кода, все ваши фрагменты могут продлить из класса фрагмента базы, который обеспечивает доступ к FillerDataExposer
реализации (на самом деле, родительская активность):
public abstract class AbstractFillerFragment extends Fragment {
protected FillerDataExposer dataExposer;
public void onAttach(Activity act) {
super.onAttach(act);
// make sure no ClassCastExceptions
this.dataExposer = (FillerDataExposer) act;
}
}
Фрагменты, которые должны записать только данные, заполненные может выглядеть это:
public class Page1Fragment extends AbstractFillerFragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = // inflate XML resource ...
yourEditText = (EditText) view.findViewById(...);
// other relevant code ....
}
public void onViewCreated(View view, Bundle savedInstanceState) {
yourEditText.setText(dataExposer.exposeFiller.setPageX$DataY());
// some code for EditText.addTextChangedListener(new TextWatcher() could look like:
yourEditText.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
dataExposer.exposeFiller().setPage1$Data0(s.toString());
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
});
}
}
в то время как фрагмент, который должен иметь доступ ко всем данным, хранящимся может выглядеть следующим образом:
public class FinalFragment extends AbstractFillerFragment {
public void collectAllData() {
DataFiller allDataCollectedObject = dataExposer.exposeFiller();
// by calling get...() you should have access to collected data.
}
}
Это только эскиз, но вы получите картину. Идея состоит в том, чтобы сохранить один объект в вашей деятельности, управляемый перезагрузкой активности, и сделать его доступным через интерфейсы, чтобы вы уважали фрагмент к шаблонам активности.
Надеюсь, это имеет смысл ...
Но я не могу получить фрагменты для 4-х первых страниц. Они могут даже не существовать. – MTilsted