Parcelable
リスナを提供するDialogFragment
があるため、ユーザがボタンをクリックしてダイアログを閉じるときに呼び出し元がコールバックを受け取ることができます(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
の実装を処理する必要があるということがより論理的であると感じています。それ以外の場合は、リスナーを実装するたびにそれらの実装を提供する必要があります。リスナーは常に同じであるため、愚かなように見えます。
とにかく、私の質問はどのアプローチが「ベストプラクティス」ですか?私が掘り下げたすべての答えは、最初のアプローチに固執しているようですが、(私の意見では「より良い」)第2のアプローチと一緒にならない理由はありますか?
本当ですか?それはそのままでうまくいくようです。また、[この回答](http://stackoverflow.com/a/31455559/930640)へのコメントでは、誰かが作成者は「インターフェース」のために必要ないと言います。メンバー変数が含まれていない抽象リスナークラスにはまだ必要ですか? – BadCash
@BadCash - – ceph3us
の編集_Why_ Creatorインターフェースを実装する必要がありますか?それはそれなしで完璧に動作するようですか? – BadCash