除了 onCreate 方法之外,无法更改视图的可见性

Posted

技术标签:

【中文标题】除了 onCreate 方法之外,无法更改视图的可见性【英文标题】:Unable to change visibility of view other than onCreate method 【发布时间】: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 【参考方案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。

以上是关于除了 onCreate 方法之外,无法更改视图的可见性的主要内容,如果未能解决你的问题,请参考以下文章

Android Sqlite - 无法在 onCreate 之外调用数据库处理程序

在 XCUITest 的可访问性指示器中找不到 stackview

禁用按钮不更改图像

如何在 Android Studio 中以除 onCreate 之外的其他方法获取应用程序的上下文?

除了Phalcon php中的indexAction之外,无法调用indexController的动作

设置android视图位置没有效果