登録されたすべての測定データを表示するMeasurementListという ListFragment が 1 つあります。新しい測定データを登録するには、NewMeasurement という名前の DialogFragment を使用して、必要な UI コントロールを入力した AlertDialog のカスタム ビューを使用します。
ここで、DialogFragment が閉じられた後に、ListFragment の測定リストを新しく登録された測定値で更新するための洗練されたソリューションが必要です。データベースからリストを更新するのではなく、新しく作成された測定オブジェクトをリストに追加するだけです。フラグメントがコールバック インターフェイスを介してアクティビティと通信するようにする方法について、Android のガイドラインに従うようにしました (アクティビティへのイベント コールバックの作成)。MeasurementList はその参照を NewMeasurement に渡し、新しい測定値を登録した後にコールバックできるようにします。問題は、NewMeasurement.newInstance() メソッドでリスナー参照を Bundle に保存する方法です。私の場合のようなオブジェクトではなく、主にプリミティブデータ型を保存しました。
ヒントや提案をいただければ幸いです。
MeasurementList.java
public class MeasurementList extends ListFragment implements OnMeasurementSetListener {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.addMeasurement:
NewMeasurement newMeasurementDialog = NewMeasurement.newInstance(this);
newMeasurementDialog.show(getFragmentManager(), "newMeasurementDialog");
break;
default:
break;
}
return true;
}
@Override
public void onMeasurementSet(Measurement measurement) {
MeasurementAdapter listAdapter = (MeasurementAdapter) getListAdapter();
listAdapter.add(measurement);
}
}
OnMeasurementSetListener.java
public interface OnMeasurementSetListener {
public abstract void onMeasurementSet(Measurement measurement);
}
NewMeasurement.java
public class NewMeasurement extends DialogFragment
{
private OnMeasurementSetListener mListener;
public static NewMeasurement newInstance(OnMeasurementSetListener listener)
{
NewMeasurement nm = new NewMeasurement();
Bundle b = new Bundle();
b.putSerializable("listener", listener); // NOT WORKING
f.setArguments(b);
return f;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final View v = factory.inflate(R.layout.layout_dialog_new_measurement, null);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.title_alert_dialog_new_weight);
builder.setIconAttribute(R.drawable.add);
builder.setView(v);
builder.setPositiveButton(R.string.alert_dialog_ok, this);
builder.setNegativeButton(R.string.alert_dialog_cancel, this);
return builder.create();
if (savedInstanceState != null)
mListener = (OnMeasurementSetListener) savedInstanceState.getSerializable("listener");
}
}