我有一个名为 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/