android - 在将数据从片段传递到活动时,存在或不存在接口有什么区别?
问题描述
我想将数据传递给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);
}
}
}
解决方案
可能无法回答您所有的问题,但使用接口会带走很多相关细节,在这种情况下,这实际上是一件好事,使您的代码更加宽松和可重用。如果你传入一个接口,你只需要确保片段/活动(或其他)也实现这个相同的接口,然后覆盖相关的方法。您要覆盖的这些方法可以有自己的实现,但这并不重要。
查看您的代码:
@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 原则,因为你将不得不改变它,因为你的代码被用于不同的活动 - 对于你想要使用它的每个新活动,你必须去改变你的对话框
推荐阅读
- mysql - 使用来自其他两个表的数据创建表时 MySQL 语法错误
- java - 如何测试调用的 catch (Exception e) { e.printStackTrace();}
- javascript - 如何将日期时间分割成单独的
- django - 如何在 Geodjango 的管理员中更改地图的默认缩放级别?
- asp.net-core - 具有自定义名称触发错误的 Web API 控制器
- php - 我提交的数据存储在两行表中,而不是一行
- r - 因子名称:as.factor(rastername) 不在图层名称中 `[.data.frame`(blockvals, , f[j]) 中的错误:选择了未定义的列
- swift - 如何使 UIColor 变暗与系统相同
- typescript - 如何使用多个 tsconfig 文件(编译器选项冲突)?
- html - 我怎样才能使下拉菜单的大小与按钮(宽度)相同