我有一个奇怪的问题。
实现
我在 ViewPager
中有 4 个 Fragment
,并附有 TabLayout
。第一个是二维码扫描仪,它显示了一个摄像头。我只想在 Fragment
可见时启动相机。为此,我覆盖了 Fragment
的方法 setUserVisibleHint
。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser) {
checkPermissionForCamera(); //it checks permission and start camera
} else {
stopCamera();
}
}
而且它工作得非常好。
需要
现在,我想要实现的是,当 Fragment
不可见(或通过滚动可见)时,它会在摄像头上方显示一个带有背景的 View ,因此覆盖的不是摄像头是可见的。如下图所示。
为此,我编辑了 startCamera
和 stopCamera
,现在它看起来像下面,
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
}
}
但是灰色的封面只有第一次可见,其余时间我打开相机并在其上滚动,如下所示。
我也尝试覆盖 OnPageChangeListener
的 onPageScrolled
,但没有成功。这是我所做的。
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) {
}
});
最佳答案
尝试以下任一方法:
1- 覆盖 setMenuVisibility :
@Override
public void setMenuVisibility(final boolean visible) {
if (visible) {
//start camera preview
}
super.setMenuVisibility(visible);
}
2- 检查 yourFragment.isResumed()
而不是 isVisible()
关于java - 在 Android 中的 viewpager 和 tablayout 中查看 fragment 中的可见性检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44512995/