检查片段当前是否可见

Vik*_*uli 16 java android android-fragments android-view android-viewpager

我知道StackOverflow中有很多类似的问题,但我的问题却略有不同.

我有嵌套的Fragments层次结构,如下面的结构:

                                  Activity
                                     |
                                     |
                                 AFragment
                                     |
                                (ViewPager)
                                 |       |         
                                 |       |         
                         BFragment       BFragment  .....
                            |                       
                       (ViewPager)                       
                        |       |                         
                        |       |                         
                 CFragment     CFragment  ...
                     |
                (ViewPager)                       
                  |     |                              
                  |     |                        
           DFragment   DFragment ...
Run Code Online (Sandbox Code Playgroud)

现在我想知道是否DFragment向用户显示?

我尝试了很多来自StackOverflow的解决方案,但无法取得成功.

我尝试的是:

我尝试setUserVisibleHint()但它返回上面的层次结构中的true多个DFragment,这是一个原因ViewPager

我也试过这些链接:link1,link2,link3等......但没有得到实际的解决方案.

等待帮助.谢谢.

UPDATE

适配器类

class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
Run Code Online (Sandbox Code Playgroud)

azi*_*ian 23

您可以检查View设备屏幕上是否显示该片段已膨胀:


    Fragment fragment = ... // retrieve from `ViewPager`'s adapter.
    View fragmentRootView = fragment.getView();
    if (fragmentRootView != null && fragmentRootView.getGlobalVisibleRect(new Rect())) {
        // fragment is visible
    } else {
        // fragment is not visible
    }

getGlobalVisibleRect()true如果视图的一部分在根级别可见,则返回.


fai*_*bal 7

尝试这个

@Override
    public void setMenuVisibility(final boolean visible) {
        super.setMenuVisibility(visible);
        if (visible) {

        }
        else
        {       

        }
    }
Run Code Online (Sandbox Code Playgroud)


Gee*_*eek 5

您可以override setUserVisibleHint()在每个片段中使用附加标志检查它是否可见。举个例子

爪哇:

boolean isVisited = false;

@Override
public void setUserVisibleHint(boolean isVisibleToUser) 
{
    super.setUserVisibleHint(isVisibleToUser);

    if (isVisibleToUser && !isVisited ) 
    {
         isVisited = true;
    }
    else if(isVisited)
    {
        // this fragment is already in front of user
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到了类似的问题。曾经我需要将数据从服务器加载到fragment仅当它在用户面前时。我按照上面的方法解决了。

科特林:

    private var isVisited: Boolean = false


    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if (isVisibleToUser && !isVisited!! )
        {
            isVisited = true;
        }
        else if(isVisited!!)
        {
            Toast.makeText(activity!!, "Location required", Toast.LENGTH_SHORT).show()
        }
    }
Run Code Online (Sandbox Code Playgroud)

希望它也能帮助你。


Dar*_*kin 5

试试这个..

在isVisible()增加了清晰视野检查的一个额外层。

    ViewPager viewPager=(ViewPager)findViewById(R.id.view_pager); 

    final Fragment[] fragments={new DFragment(),new MyFragment()};  //add all the other fragment objects present in the view pager......

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            if(fragments[position].isVisible()){
                //Cool stuff to do.
            }
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });
Run Code Online (Sandbox Code Playgroud)