各フラグメントが埋めるデータを保持するカスタム オブジェクトを持つことを検討します。何かのようなもの:
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
}
親アクティビティによって管理されるそのようなオブジェクトは 1 つだけで、親アクティビティはこのオブジェクトを公開するためのインターフェイスを実装します。
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.
}
}
これはスケッチにすぎませんが、イメージは得られます。アイデアは、アクティビティの再起動全体で管理されるアクティビティ内の単一のオブジェクトを保持し、インターフェイスを介してアクセスできるようにすることで、フラグメントからアクティビティへのパターンを尊重します。
それが理にかなっていることを願っています...