无法更改 onCreate 方法以外的视图的可见性

Unable to change visibility of view other than onCreate method

我无法在其他函数而不是 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 方法。只是为了测试,名为 toast 的消息显示在 UI 上。但是我无法控制 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();
            }
        });
    }

请尝试view.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

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

来源: