【问题标题】:Getting Fragment context instead of Activity when clicking on FAB单击 FAB 时获取片段上下文而不是 Activity
【发布时间】: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 永远不会被实例化,因为 contextMainActivity 而不是 DestinationListFragment 因为那是 FAB 所在的位置,因此不是 FilterListener 的实例。我尝试将 FAB 移动到 DestinationListFragment 的布局,但传递的上下文仍然是 MainActivity 的。我无法将代码移到 MainActivity 因为 DestinationListFragment 中的其他方法依赖它。如何更改代码以传递 DestinationListFragment 的上下文而不是 MainActivity 的?

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

【问题讨论】:

  • Fragment 不是Context。在Fragment 中调用的getContext() 将始终返回父Activity's Context(或null)。
  • 所以我按照@MarkKeen 的建议将监听器提升到 MainActivity。在其中,我简单地调用片段的onFilter()。它现在按预期工作!然而,这是一个好的解决方案吗?像这方面有什么问题吗?再次感谢顺便说一句!

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


【解决方案1】:

MainActivity 我实现了FilterDialogFragment.FilterListener 并像这样覆盖onFilter()

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多