除了 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.
)
编辑更新:
无法更新imageAnalysis
的analyze
方法。只是为了测试,在 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 之外的其他方法获取应用程序的上下文?