java - 删除 View 的子级然后读取它后, View 将无法正常显示

标签 java android android-view

我创建了一个包含两个 View 的 View 。一旦 View 为等候室 (A) 和第二 View (B),就可以接听电话。

调用到达 View A 后,将调用第二个 View (B)。有用。如果用户完成了交互,他应该返回到 View (A)。不幸的是,这不起作用。

这是调用 View B 的代码。这很好用。

// Add view to content
OVSLobbyActivity.this.rootWaitingRoom.view.setVisibility(View.GONE);
OVSLobbyActivity.this.root.removeChild(OVSLobbyActivity.this.rootWaitingRoom);
OVSLobbyActivity.this.root.appendChild(OVSLobbyActivity.this.rootCallRoom);
OVSLobbyActivity.this.rootCallRoom.view.setVisibility(View.VISIBLE);

// Set fullscreen
OVSLobbyActivity.this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
OVSLobbyActivity.this.onWindowFocusChanged(true);

// force to change the layout
root.view.invalidate();
root.view.requestLayout();

下面是隐藏 View B 并再次显示 View A 的代码。这效果不太好。这是只显示白色页面的问题。 Activity 内的元素丢失。

this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
this.onWindowFocusChanged(false);


this.rootCallRoom.view.setVisibility(View.GONE);
this.root.removeChild(OVSLobbyActivity.this.rootCallRoom);
this.root.appendChild(OVSLobbyActivity.this.rootWaitingRoom);
this.rootWaitingRoom.view.setVisibility(View.VISIBLE);

// force to change the layout
root.view.invalidate();
root.view.forceLayout();
root.view.requestLayout();

你知道出了什么问题吗? 感谢您的帮助。

最佳答案

解决方案是必须重新计算 View 的大小。重新计算度量后,您必须执行以下行:

this.view.requestLayout ();

之后将显示正确的 View 。

关于java - 删除 View 的子级然后读取它后, View 将无法正常显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55459733/

相关文章:

Java Gson .add 函数不采用 String 参数(maven 项目)

java - 为Hadoop设置我的JAVA_HOME变量

android - Listview行requestLayout()和View回收

android - 如何创建克隆重复 View ?

android - 更改 Spinner 下拉按钮的背景颜色

java - 为什么 Kotlin 进行空检查,当反编译为 Java 时会声明一些未使用的变量?

java - 出现此错误 "Cannot invoke set(int, String) on the array type String[]"

android - 从其他 fragment 更新 Listview

java - ReadObject 返回 OptionalDataException

android - 隐藏View的平移动画