android - 使用 DialogFragment AlertDialog 中的更改更新 ListFragment(父级)中的列表

标签 android android-dialogfragment

我有一个名为 MeasurementList 的 ListFragment,它显示所有已注册的测量数据。要注册新的测量数据,我使用名为 NewMeasurement 的 DialogFragment,在 AlertDialog 中使用自定义 View ,并填写所需的 UI 控件。

现在,我需要一个优雅的解决方案,在 DialogFragment 关闭后用新注册的测量更新 ListFragment 中的测量列表。我不想从数据库更新列表,而只是将新创建的 Measurement 对象添加到列表中。我已尝试遵循 Android 指南,了解如何使 fragment 通过回调接口(interface) (Creating event callbacks to the activity) 与 Activity 进行通信。 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");
    }
}

最佳答案

您好,您可以尝试通过设置新的测量来处理此 onAttach 方法,它将创建对您的 Activity 的回调。

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

关于android - 使用 DialogFragment AlertDialog 中的更改更新 ListFragment(父级)中的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14033621/

相关文章:

Android 找不到微调器的符号变量错误

android - 自定义 View 只显示一次

android - 更改对话框 fragment 中自定义对话框的高度

android - 从 dialogFragment 返回后 getActivity() 返回 null

android - 如何从一个项目创建多个 apk?

android通知仅播放声音通知未显示在通知抽屉中

javascript - PhoneGap 和 Joomla 网络服务

Android,与 Android OS api 级别 8+ 兼容的自定义 DialogFragment

android - 如何在 Android 中只允许一个特定 fragment 同时具有纵向和横向方向?

android - 单击 DialogFragment 正按钮后如何执行操作