【问题标题】:Fragment isVisible() returns false despite fragment being in foreground尽管片段在前台,但片段 isVisible() 返回 false
【发布时间】:2018-08-08 23:45:46
【问题描述】:

我在 Activity 的工具栏中有一个 SearchView,它承载一个 Fragment,它有一个 ViewPager 的 4 个选项卡,每个选项卡由另一个 Fragment 组成(这种结构是有原因的,所以我不想详述除非有人认为这是我的问题的原因)。当用户最初搜索某些内容时,一切正常。但是,当用户编辑搜索查询并按 Enter 键时,已选择的选项卡不会刷新(当我们从它导航到其他选项卡然后返回时它会刷新)。

以下是我的意思的截图(第一张图片是在原始搜索之后,一切都很好,第二张图片是我正在编辑查询,第三张图片是我点击回车后 - 结果保持不变并且没有任何更新,因为下面代码中的 isVisible() 在片段对我来说似乎清晰可见时返回 false)。

当一个查询被提交时,Activity 会将搜索查询发送到包含 ViewPager 和 TabLayout 的片段,该片段将其传递给当前选项卡。这是提交查询后在包含 ViewPager 的 Fragment 中调用的代码:

public void setSearchQuery (String query) {
        //mTabLayout.requestFocus();
        mSearchQuery = query;

        Fragment fragment = mPagerAdapter.getItem(mViewPager.getCurrentItem()); // should theoretically get the current fragment
        mTabLayout.getTabAt(mViewPager.getCurrentItem()).select();

        if (fragment != null && fragment.isVisible()) {
            ((ResultsPagerAdapter.QuerySubmitCallback) fragment).submitQuery(query);
        }
    }

底部的 submitQuery() 行永远不会被调用,因为 isVisible 返回 false。但是,在记录当前选项卡的生命周期方法时,最后一次调用是 onStart(),然后是 onResume()。当我单击工具栏并编辑查询并按回车键时,这不会改变,并且当前选项卡是可见的,所以我不知道为什么返回 false。

我应该在用户提交查询后添加托管活动,我从工具栏和 SearchView 中移除焦点,以便在输入搜索后键盘折叠。

【问题讨论】:

    标签: android android-fragments android-viewpager searchview android-tablayout


    【解决方案1】:

    当你切换标签时,fragment会调用setUserVisibleHint(boolean isVisibleToUser)。然后,你可以通过getUserVisibleHint()获取isVisibleToUser的值。

    如果你想得到各种fragment中的isVisible,你应该用这样的方法更新isVisible的值:

    onAttachonDetach()

    onStart()onStop()

    onHiddenChanged

    setUserVisibleHint

    onViewAttachedToWindowonViewDetachedFromWindow

    【讨论】:

    • 感谢您的回复。这实际上最终成为我没有从寻呼机获得正确片段的问题。调用 mPagerAdapter.getItem() 时,它实际上是在选定索引处创建一个新片段,而不是返回当前片段(这是我第二次从 viewpager 获取当前片段时遇到问题 - 不知道为什么这么难要做的事)。我最终使用了这里找到的解决方案:stackoverflow.com/a/18611036/7648952 - 这对我来说似乎很丑陋,但我想会这样做,因为我没有看到其他解决方法。
    • 好的,如果你想解决问题而不是改变另一个解决方案,你应该显示更多关于mPagerAdapter的代码。这就是我的代码 mPagerAdapter.getItem private List mFragments; @Override public Fragment getItem(int position) { // TODO 自动生成的方法存根 return mFragments.get(position); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    相关资源
    最近更新 更多