【发布时间】:2025-12-01 02:20:03
【问题描述】:
我有一个DialogFragment,它提供了一个Parcelable 侦听器,因此当用户单击其中一个按钮关闭对话框时,调用者可以收到回调(它需要是Parcelable 才能存储在参数Bundle)。
起初,我将其声明为interface,如下所示:
public class EditTrackDialogFragment extends AppCompatDialogFragment {
public interface OnEditTrackDialogListener extends Parcelable{
public abstract void onSave(TrackData trackData);
public abstract void onCancel(TrackData trackData);
}
// ...
}
...然后像这样实现它:
public class MainActivity extends AppCompatActivity {
// ...
private EditTrackDialogFragment.OnEditTrackDialogListener onEditTrackDialogListener = new EditTrackDialogFragment.OnEditTrackDialogListener() {
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
}
@Override
public void onSave(TrackData trackData) {
Log.v(TAG, "Track saved");
}
@Override
public void onCancel(TrackData trackData) {
Log.v(TAG, "Edit cancelled");
}
};
}
但我认为实例化器需要处理Parcelable 接口的实现似乎并不正确。所以我尝试将监听器声明为一个抽象类,它本身实现了Parcelable,如下所示:
public class EditTrackDialogFragment extends AppCompatDialogFragment {
public static abstract class OnEditTrackDialogListener implements Parcelable{
public abstract void onSave(TrackData trackData);
public abstract void onCancel(TrackData trackData);
public OnEditTrackDialogListener() {
}
protected OnEditTrackDialogListener(Parcel in) {
}
@Override
public void writeToParcel(Parcel dest, int flags) {
}
@Override
public int describeContents() {
return 0;
}
}
// ...
}
...并提供了这样的具体实现:
public class MainActivity extends AppCompatActivity {
// ...
private EditTrackDialogFragment.OnEditTrackDialogListener onEditTrackDialogListener = new EditTrackDialogFragment.OnEditTrackDialogListener() {
@Override
public void onSave(TrackData trackData) {
Log.v(TAG, "Track saved");
}
@Override
public void onCancel(TrackData trackData) {
Log.v(TAG, "Edit cancelled");
}
};
}
在我看来,这更干净,而且感觉更合乎逻辑的是,提供侦听器“接口”的DialogFragment 是应该处理Parcelable 实现的人。否则我每次实现监听器时都必须提供这些实现,这看起来很愚蠢,因为它们总是相同的,更不用说代码变得更加混乱了。
无论如何,我的问题是哪种方法是“最佳实践”?我设法挖掘出的所有答案似乎都坚持第一种方法,但是有什么好的理由不采用(在我看来“更好”)第二种方法吗?
【问题讨论】:
标签: java android interface listener abstract-class