简体   繁体   中英

view visibility check in fragment inside viewpager and tablayout in Android

I have a weird problem.

Achieved

I have 4 Fragment s in a ViewPager attached with TabLayout . The first one is QR-code Scanner, which shows a camera. I wanted to start camera only when the Fragment is visible. For this, I override the Fragment 's method setUserVisibleHint .

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(isVisibleToUser) {
        checkPermissionForCamera();        //it checks permission and start camera
    } else {
        stopCamera();
    }
}

And it's working absolutely fine.

Desired

Now, what I want to achieve is that when Fragment is not visible (or is being visible by scrolling), it shows a view with background over camera, so that instead of camera, that cover is visible. Like image below.

见灰色部分

For it, I edited startCamera and stopCamera , now it looks like below,

public void startCamera() {
    if(cameraCover != null)
        cameraCover.setVisibility(View.GONE);
    isCameraStarted = true;
    mScannerView.setResultHandler(this); // Register ourselves as a handler for scan results.
    mScannerView.startCamera();
}

public void stopCamera() {
    if(cameraCover != null)
        cameraCover.setVisibility(View.VISIBLE);
    if(mScannerView != null) {
        isCameraStarted = false;
        mScannerView.stopCamera();// Stop camera on pause
        mScannerView.stopCameraPreview();// Stop camera preview
    }
}

But the gray cover is only visible for the first time, rest of the time I get the camera opened with view on which it's scrolled, like below.

见视图部分

I've also tried to override onPageScrolled of OnPageChangeListener , but with no luck. Here's what I've done.

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

        if(position == 0) {
            if(positionOffset > 0.7) {
                fragment = adapter.getItemAtPosition(0);   //fragment is at zero
                if(fragment != null) {
                    if(fragment instanceof ScanQRFragment) {
                        ((ScanQRFragment) fragment).stopCamera();
                    }
                }
            } 
        }

    }

    @Override
    public void onPageSelected(int position) {

    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});

Try either of the following ways :

1- override setMenuVisibility :

@Override
public void setMenuVisibility(final boolean visible) {
   if (visible) {
      //start camera preview
   }

   super.setMenuVisibility(visible);
}

2- Check yourFragment.isResumed() instead of isVisible()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM