如何在不向下推视图的情况下将 WebView 堆叠在顶部并将 url 加载到其中
How to stack WebViews on top and load url into it without pushing views down
在我们的应用程序中,我正在加载初始网络视图。然后为了让用户看到聊天记录,我想在最初的那个之上添加新的 webviews。我现在这样做的方法是用一个线性布局来包裹初始的 webview;这个 LinearLayout 叫做 webview_wrapper 并且在一个 ScrollView 中。然后,使用 ScrollViewListener 界面,当用户向上滚动经过设置的坐标时,我创建了一个新的 webview,将其命名为 newWebView,并调用 webview_wrapper.addView(newWebView, 0),我遇到的问题是我想在屏幕外加载和添加 webview,然后用户可以继续向上滚动。这种添加和滚动发生在 AnimationListener 的 onAnimationEnd 方法内部(当我对 webview 发出 post 请求时)。
我觉得我已经尝试了各种方法,比如在添加视图后调用 scrollTo 或 scrollBy,但它只是部分滚动。执行此操作的最佳方法是什么?
这个问题最终通过在包含的 ScrollView 上使用 OnGlobalLayoutListener 来解决,我在其中调用了 scrollTo(0, webViewHeight) 和 removeOnGlobalLayoutListener(this)。在此之前,我使 WebView 可见,通过 setLayoutParams 设置其高度(视图必须首先可见)。
如果我错了请纠正我,但由于 OnGlobalLayoutListener,这可能会像它一样无缝地工作。当视图可见并设置高度时,在我们设置一个 OnGlobalLayoutListener 之后,在布局 scrollView 时将 scrollTo() 触发到新视图的确切高度,最终结果变成视图膨胀的外观关闭屏幕。
final int newHeight = (int) ((height / 380.0) * webView.getWidth());
// Must set visible before setting layout params
currentOldView.setVisibility(View.VISIBLE);
// Without this line, view will bounce around as it attempts to self set the height based on HTML content
currentOldView.setLayoutParams(new LinearLayout.LayoutParams(webView.getWidth(), newHeight));
// Use viewTreeObserver to wait until scrollView completely laid out before attempting to scroll
ViewTreeObserver observer = scrollView.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
scrollView.scrollTo(0, newHeight); // Because spinner_wrapper still on view, will scroll to an overlap point.
canAddOldChat = true;
currentOldView.startAnimation(fadeInAnim);
if (isLastOldChat) spinner_wrapper.setAlpha(0.0f);
scrollView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
在我们的应用程序中,我正在加载初始网络视图。然后为了让用户看到聊天记录,我想在最初的那个之上添加新的 webviews。我现在这样做的方法是用一个线性布局来包裹初始的 webview;这个 LinearLayout 叫做 webview_wrapper 并且在一个 ScrollView 中。然后,使用 ScrollViewListener 界面,当用户向上滚动经过设置的坐标时,我创建了一个新的 webview,将其命名为 newWebView,并调用 webview_wrapper.addView(newWebView, 0),我遇到的问题是我想在屏幕外加载和添加 webview,然后用户可以继续向上滚动。这种添加和滚动发生在 AnimationListener 的 onAnimationEnd 方法内部(当我对 webview 发出 post 请求时)。
我觉得我已经尝试了各种方法,比如在添加视图后调用 scrollTo 或 scrollBy,但它只是部分滚动。执行此操作的最佳方法是什么?
这个问题最终通过在包含的 ScrollView 上使用 OnGlobalLayoutListener 来解决,我在其中调用了 scrollTo(0, webViewHeight) 和 removeOnGlobalLayoutListener(this)。在此之前,我使 WebView 可见,通过 setLayoutParams 设置其高度(视图必须首先可见)。
如果我错了请纠正我,但由于 OnGlobalLayoutListener,这可能会像它一样无缝地工作。当视图可见并设置高度时,在我们设置一个 OnGlobalLayoutListener 之后,在布局 scrollView 时将 scrollTo() 触发到新视图的确切高度,最终结果变成视图膨胀的外观关闭屏幕。
final int newHeight = (int) ((height / 380.0) * webView.getWidth());
// Must set visible before setting layout params
currentOldView.setVisibility(View.VISIBLE);
// Without this line, view will bounce around as it attempts to self set the height based on HTML content
currentOldView.setLayoutParams(new LinearLayout.LayoutParams(webView.getWidth(), newHeight));
// Use viewTreeObserver to wait until scrollView completely laid out before attempting to scroll
ViewTreeObserver observer = scrollView.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
scrollView.scrollTo(0, newHeight); // Because spinner_wrapper still on view, will scroll to an overlap point.
canAddOldChat = true;
currentOldView.startAnimation(fadeInAnim);
if (isLastOldChat) spinner_wrapper.setAlpha(0.0f);
scrollView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});