首页 > 解决方案 > 在将数据从片段传递到活动时,存在或不存在接口有什么区别?

问题描述

我想将数据传递给activity'dialog fragment的窗口关闭时。

我在活动中定义了一个方法作为传递数据的一种方式。

在fragment中,我用来getActivity()获取activity的引用并调用相应的方法。

顺便说一句,我看到大多数其他文章都使用interface.

那些文章在片段中定义了接口,并在活动中实现了它。

而在片段中,使用getActivity()context of onAttach()来调用转换后的实现方法。

为什么一定要定义接口?

我这样做的方式相同,结果似乎是一样的。

这是我的代码

MainActivity.java

public class WriteRoutineActivity extends AppCompatActivity {
   
    List<RoutineModel> items;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_write_routine);

        initViews();
    }

    public void getComments(List<Comment> comments, int pos) {
        Object obj = routineAdapter.getRoutineItem(pos);
        if(obj instanceof RoutineModel) {
            RoutineModel item = (RoutineModel) obj;
            item.setComments(comments);
        }
        else
            return;
    }
}

WCDialogFragment.java

public class WritingCommentDialogFragment extends DialogFragment implements CommentModel.EditInputListener {
    private final List<Comment> comments = new ArrayList<>();
    int pos;

    public WritingCommentDialogFragment(int pos) {
        this.pos = pos;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        setWindowSize();
        View view = inflater.inflate(R.layout.fragment_writing_comment_dialog, container, false);
        bindViews(view);
        return view;
    }

    @Override
    public void onCancel(@NonNull DialogInterface dialog) {
        super.onCancel(dialog);
        if(getActivity() != null && getActivity() instanceof WriteRoutineActivity) {
            WriteRoutineActivity activity = (WriteRoutineActivity) getActivity();
            activity.getComments(comments, pos); 
        }
    }
}

标签: androidandroid-fragments

解决方案


可能无法回答您所有的问题,但使用接口会带走很多相关细节,在这种情况下,这实际上是一件好事,使您的代码更加宽松和可重用。如果你传入一个接口,你只需要确保片段/活动(或其他)也实现这个相同的接口,然后覆盖相关的方法。您要覆盖的这些方法可以有自己的实现,但这并不重要。

查看您的代码:

@Override
public void onCancel(@NonNull DialogInterface dialog) {
    super.onCancel(dialog);
    if(getActivity() != null && getActivity() instanceof WriteRoutineActivity) {
        WriteRoutineActivity activity = (WriteRoutineActivity) getActivity();
        activity.getComments(comments, pos); 
    }
}

问题在于:

if(getActivity() != null && getActivity() instanceof WriteRoutineActivity)

所以现在这个对话框与WriteRoutineActivity.

如果我想在其中使用此对话框会FooBarActivity怎样?

if(getActivity() != null && getActivity() instanceof WriteRoutineActivity || FooBarActivity)

现在又上课了?

if(getActivity() != null && getActivity() instanceof WriteRoutineActivity || FooBarActivity ||.....)

所以你违反了 SOLID 原则,因为你将不得不改变它,因为你的代码被用于不同的活动 - 对于你想要使用它的每个新活动,你必须去改变你的对话框


推荐阅读