2

登録されたすべての測定データを表示する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");
    }
}
4

2 に答える 2

2

こんにちは、アクティビティへのコールバックを作成する新しい測定を設定することで、この onAttach メソッドの処理を試みることができます。

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);
    }
}

NewMeasurement.java

public class NewMeasurement extends DialogFragment {

    public interface OnMeasurementSetListener {
        public abstract void onMeasurementSet(Measurement measurement);
    }

    private OnMeasurementSetListener onMeasurementSetListener;
    private Measurement currentMeasurement;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            Measurement measurement = new Measurement();
            measurement.s = "fragment";
            onMeasurementSetListener = (OnMeasurementSetListener) activity;
            setMeasurement(measurement);

        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement onMeasurementSetListener");
        }
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Fragment Dialog");
        builder.setIconAttribute(R.drawable.ic_launcher);
        builder.setPositiveButton(R.string.app_name, new OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub

            }
        });
        builder.setNegativeButton(R.string.app_name, new OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub

            }
        });
        return builder.create();
    }

    private void setMeasurement(Measurement measurement) {
        currentMeasurement = measurement;
        onMeasurementSetListener.onMeasurementSet(measurement);
    }

}

サンプル Measurement.java

public class Measurement {
    public String s;
}
于 2012-12-25T20:43:37.340 に答える