【发布时间】:2018-01-29 23:32:39
【问题描述】:
所以我不能准确地发布整个代码,因为它是分散在文件中的,但我会尽力解释。
我的 android 应用程序的结构如下:
MainActivity
|__Toolbar
|__ViewPager
| |__DestinationListFragment
| |__DestinationMapFragment
|
|___FAB
DestinationListFragment 包含一个 RecyclerView,它显示来自 Firebase Firestore 数据库的数据。 DestinationMapFragment 做同样的事情,除了在地图上填充它们 - 对于这个问题,这个片段是无关紧要的。
FAB 存在于 MainActivity 的布局中,因为它以适当的高度显示,我可以轻松地.hide() 或.show() 它。单击时,它会打开一个对话框(其代码在 FilterDialogFragment 中),允许用户过滤项目。
FilterDialogFragment 有一个 FilterListener 接口,如下所示:
interface FilterListener {
void onFilter(Filters filters);
}
private FilterListener mFilterListener;
然后像这样在 DestinationListFragment 中实现
public class DestinationListFragment extends Fragment implements
FilterDialogFragment.FilterListener,
DestinationAdapter.OnDestinationSelectedListener {
/* some code */
@Override
public void onFilter(Filters filters){
/* some code */
}
}
现在,为了在 FilterFragmentDialog 中实例化 mFilterListener,我在其 onAttach() 方法中调用以下代码:
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof FilterListener) {
mFilterListener = (FilterListener) context;
}
}
但是,mFilterListener 永远不会被实例化,因为 context 是 MainActivity 而不是 DestinationListFragment 因为那是 FAB 所在的位置,因此不是 FilterListener 的实例。我尝试将 FAB 移动到 DestinationListFragment 的布局,但传递的上下文仍然是 MainActivity 的。我无法将代码移到 MainActivity 因为 DestinationListFragment 中的其他方法依赖它。如何更改代码以传递 DestinationListFragment 的上下文而不是 MainActivity 的?
我使用Firebase's sample app 作为过滤代码的基础。一切似乎都在听者之外。
【问题讨论】:
-
通过主机交流
Activity- developer.android.com/training/basics/fragments/… -
Fragment不是Context。在Fragment中调用的getContext()将始终返回父Activity'sContext(或null)。 -
所以我按照@MarkKeen 的建议将监听器提升到 MainActivity。在其中,我简单地调用片段的
onFilter()。它现在按预期工作!然而,这是一个好的解决方案吗?像这方面有什么问题吗?再次感谢顺便说一句!
标签: java android firebase android-fragments google-cloud-firestore