尽管片段位于前景中,但片段isVisible()返回false

时间:2018-08-08 23:45:47

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

我在一个活动的工具栏中有一个SearchView,其中包含一个Fragment,该Fragment的ViewPager包含4个选项卡,每个选项卡都由另一个Fragment组成(这种结构是有原因的,所以我不想在此进行详细介绍除非有人认为这是我出现问题的原因)。当用户最初搜索某些内容时,一切正常。但是,当用户去编辑搜索查询并按回车时,已经选择的选项卡不会刷新(当我们离开它导航到其他选项卡然后返回时,它将刷新)。

以下是我的意思的屏幕截图(第一张图片在原始搜索之后,一切都很好,第二张图片是我在编辑查询,第三张图片是在我按下Enter键之后-结果保持不变并且没有任何更新,因为当我看到的片段清晰可见时,下面代码中的isVisible()返回false。

enter image description here enter image description here enter image description here

本质上,当提交查询时,活动将搜索查询发送到包含ViewPager和TabLayout的片段,然后将其传递给当前的Tab。提交查询后,这是包含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);
        }
    }

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

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

1 个答案:

答案 0 :(得分:0)

切换选项卡时,fragment将调用setUserVisibleHint(boolean isVisibleToUser)。然后,您可以通过isVisibleToUser来获得getUserVisibleHint()的值。

如果要获取各种isVisible中的fragment,则应使用以下方法更新isVisible的值:

onAttachonDetach()

onStart()onStop()

onHiddenChanged

setUserVisibleHint

onViewAttachedToWindowonViewDetachedFromWindow