【问题标题】:Unable to change visibility of view other than onCreate method除了 onCreate 方法之外,无法更改视图的可见性
【发布时间】:2021-04-11 04:20:24
【问题描述】:

我无法更改其他函数中的视图可见性,而不是 onCreate 方法。它只在onCreate 时工作。

public class CameraXActivity extends AppCompatActivity {
    ...
    public Group fipGroup;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camerax_layout); // Created xml using constraintLayout.

        //intial setup
        fipGroup = (Group)findViewById(R.id.fip_group);
        startCamera();

        //hideFipGroup(); <<--- This is working
    }

    private void hideFipGroup() {
        Log.d(TAG, "=== hideFipGroup ===");
        fipGroup.setVisibility(View.INVISIBLE);
    }

    private void startCamera() {
        CameraX.unbindAll();
        preview = setPreview(); 
        imageAnalysis = setImageAnalysis();

        //bind to lifecycle:
        CameraX.bindToLifecycle(this, preview , imageAnalysis);
        preview.enableTorch(true);
    }

    private ImageAnalysis setImageAnalysis() {
        hideFipGroup() // This is working
        imageAnalysis.setAnalyzer(
                new ImageAnalysis.Analyzer() {
                    @Override
                    public void analyze(ImageProxy image, int rotationDegrees) {
                        hideFipGroup() // Exactly, Failed at this place.
                    }
                }
        )
    }

}

编辑更新:

无法更新imageAnalysisanalyze 方法。只是为了测试,在 UI 上显示的称为 toast 消息。但我无法控制 UI。

private void raiseToast(String msg) {

        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                Toast toast = Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG);
                toast.setGravity(Gravity.CENTER, 0, 500);
                toast.show();
            }
        });
    }

【问题讨论】:

  • 我敢打赌,您的代码的“完整版”中有一些棘手/错误的方法,这对您的情况至关重要,而您刚刚将其删除...例如startCamera 中的一些悬挂 UI 代码代替了三个点。发布的代码非常好并且可以工作(两个调用)
  • 更新了代码 sn-p。 @snachmsm
  • 当您注释掉CameraX.unbindAll(); 行和下面的所有startCamera 是否有效?它只会调用hideFipGroup()
  • @snachmsm 我有更新的完整代码。刚刚追踪了这个问题。未能更新 imageAnalysis 的 analyze 方法。知道我们如何处理这个地方吗?
  • 使用fipGroup.post(...)方法在analyze内部调用hideFipGroup

标签: android visibility android-camerax


【解决方案1】:

problem 在约束布局上具有组可见性。

private void setGroupVisiblity(Group group, int visibility) {
   group.setVisibility(visibility);
   group.requestLayout();
}

或手动关闭组中的每个视图:

private void setGroupVisibility(ConstraintLayout layout, Group group, Integer visibility) {
     int[] refIds = group.getReferencedIds();
     for (int id : refIds) {
          layout.findViewById(id).setVisibility(visibility);
     }
}

或升级到ConstraintLayout version 2.0.0 beta 6

来源:Can't set visibility on constraint group

【讨论】:

    【解决方案2】:

    请尝试查看.post 或runOnUIThread 方法。

    就是这样。

    private ImageAnalysis setImageAnalysis() {
        hideFipGroup() // This is working
        imageAnalysis.setAnalyzer(
                new ImageAnalysis.Analyzer() {
                    @Override
                    public void analyze(ImageProxy image, int rotationDegrees) {
                        fipGroup.post(new Runnable() {
                           @Override
                           public void run() {
                               hideFipGroup();  // Exactly, Failed at this place.
                           }
                        });
                    }
                }
        )
    }
    

    或者你可以简单地在 hideFipGroup() 方法中调用 view.post() 方法

    private void hideFipGroup() {
        Log.d(TAG, "=== hideFipGroup ===");
        fipGroup.post(new Runnable() {
            @Override
            public void run() {
                fipGroup.setVisibility(View.INVISIBLE);
            }
        });
    }
    

    【讨论】:

    • 嘿,在 UI 线程上尝试了同样的更新。但是仍然看不到可见性的任何变化。它也执行了run 方法。
    • 嗨,调用了 public void analyze(ImageProxy image, int rotationDegrees) 方法?
    • 是的。每一帧都会调用它。
    • ^ 并且仅根据逻辑将其隐藏一次。
    【解决方案3】:

    你应该检查你调用的函数。请记住,您只能在主线程中更新 UI

    【讨论】:

    • 是的。尝试相同。但对能见度没有影响。我可以在 UI 上触发 Toast 消息。但不确定为什么无法控制 UI。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2016-12-27
    相关资源
    最近更新 更多