[英]Gluon Mobile Charm 5.0 Cannot Hide Layer
我有所有后端请求的加载gif。 在Charm 5.0.0之前,它可以正常工作,显示加载的gif,后端完成所需的操作,然后隐藏加载的gif。 现在,显示了加载的gif, 但它没有隐藏。
addLayerFactory(LOADING_GIF, () -> new Layer() {
private final Node root;
private final double sizeX = getGlassPane().getWidth();
private final double sizeY = getGlassPane().getHeight();
{
ProgressIndicator loading = new ProgressIndicator();
loading.setRadius(50);
loading.setStyle("-fx-text-fill:white");
root = new StackPane(loading);
root.setStyle("-fx-background-color: rgba(0,0,0,0);");
getChildren().add(root);
this.setStyle("-fx-background-color:rgba(255,255,255,0.7)");
this.setShowTransitionFactory(v -> {
FadeInTransition ft = new FadeInTransition(v);
ft.setRate(2);
return ft;
});
}
@Override
public void show() {
this.setBackgroundFade(0.0);
super.show();
Layer pane = this;
Task<Integer> task = new Task<Integer>() {
@Override
protected Integer call() throws Exception {
int iterations = 0;
int max = DataService.readOutTime / 1000;
while (iterations <= max) {
Thread.sleep(1000);
iterations++;
}
Platform.runLater(new Runnable() {
@Override
public void run() {
if (pane.isVisible()) {
pane.setShowTransitionFactory(v -> {
FadeOutTransition ft = new FadeOutTransition(v);
ft.setRate(2);
return ft;
});
pane.hide();
MobileApplication.getInstance().showMessage("There was an error in sending your data.");
}
}
});
return iterations;
}
};
Thread thread = new Thread(task);
thread.start();
}
@Override
public void hide() {
this.setBackgroundFade(0.0);
super.hide();
}
@Override
public void layoutChildren() {
root.setVisible(isShowing());
if (!isShowing()) {
return;
}
root.resize(sizeX, sizeY);
resizeRelocate((getGlassPane().getWidth() - sizeX) / 2, (getGlassPane().getHeight() - sizeY) / 2, sizeX, sizeY);
}
});
我有几个实用程序方法可以显示和隐藏加载程序:
public void showLoader() {
MobileApplication.getInstance().showLayer(App.LOADING_GIF);
}
public void hideLoader() {
MobileApplication.getInstance().hideLayer(App.LOADING_GIF);
}
有趣的是,我创建的自定义超时(以隐藏加载程序,以防后端出现停顿)也不会隐藏该层。
您的代码有一个问题:您正在覆盖Layer::layoutChildren
,但是您没有在调用super.layoutChildren()
。
如果您检查JavaDoc :
重写此方法可为您的图层添加布局逻辑。 为了使Layer正常运行,应注意在覆盖的方法中调用此方法。
这意味着您将摆脱“图层”控件的一些重要部分,例如动画,事件和可见性控件。
这应该工作:
@Override
public void layoutChildren() {
super.layoutChildren();
root.setVisible(isShowing());
if (!isShowing()) {
return;
}
root.resize(sizeX, sizeY);
resizeRelocate(getGlassPane().getWidth() - sizeX) / 2, getGlassPane().getHeight() - sizeY) / 2, sizeX, sizeY);
}
另外,对于隐藏过渡,应使用setHideTransitionFactory
。
所以这就是我为解决这个问题所做的。 在hide()
方法的Gluon Docs中:
如果显示此层,则调用此方法将隐藏它。 如果存在隐藏过渡,则在隐藏图层之前将其播放。 只有在LifecycleEvent.SHOWN被触发后才应注意调用此方法。
因此,我意识到来自后端的响应是在完全显示该层之前出现的。 因此,我修改了覆盖的hide()
方法,如下所示:
@Override
public void hide() {
if (this.isShowing()) {
this.setOnShown(e -> {
this.setBackgroundFade(0.0);
super.hide();
});
} else {
super.hide();
}
}
因此,如果在被告知要隐藏时该图层仍处于LifecycleEvent.SHOWING模式,请确保在显示该图层时将其隐藏。 否则它已经显示,所以将其隐藏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.