java - 在 Android 中的 viewpager 和 tablayout 中查看 fragment 中的可见性检查

标签 java android android-layout android-fragments android-viewpager

我有一个奇怪的问题。

实现

我在 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 ,因此覆盖的不是摄像头是可见的。如下图所示。

See the gray part

为此,我编辑了 startCamerastopCamera,现在它看起来像下面,

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
    }
}

但是灰色的封面只有第一次可见,其余时间我打开相机并在其上滚动,如下所示。

See the view part

我也尝试覆盖 OnPageChangeListeneronPageScrolled,但没有成功。这是我所做的。

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/

相关文章:

android - 使用 fragment 将其他元素(不是ListView)添加到抽屉导航

java - 在从 JTextField 读取之前等待键

java - 将 room 中的行插入到主线程后如何获取插入的行 id

Android recyclerview 分隔符与内部布局 View 对齐

java - 无法从文件读回 protobuf

android - 处理选项卡、操作栏、 Activity 和 fragment

java - 创建同一类的多个对象时出现问题

java - 如何在 JNA 中调用带有前导下划线和尾随 @ 的方法

Java/Android : adding/removing values to/from array by clicking a button?

android - 如何覆盖 android 样式的私有(private)属性