单击FAB时获取Fragment上下文而不是Activity

时间:2018-01-29 23:32:39

标签: java android firebase android-fragments google-cloud-firestore

因此,我无法完整地发布整个代码,因为它会在文件中分散,但我会尽力解释。

我的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 &#39。我无法将代码移至 MainActivity ,因为 DestinationListFragment 中的其他方法依赖于此。如何更改代码以便传递 DestinationListFragment 的上下文而不是 MainActivity

我使用Firebase's sample app作为过滤代码的基础。除听众外,一切似乎都在。

1 个答案:

答案 0 :(得分:0)

MainActivity 中,我实施了FilterDialogFragment.FilterListener并覆盖onFilter(),如下所示:

@Override
public void onFilter(Filters filters) {
    DestinationListFragment fragment = (DestinationListFragment) mPagerAdapter.getItem(0);
    fragment.onFilter(filters);
}