如何根据其内容动态地收缩的WebView大小?(How to Shrink WebView size

2019-07-22 08:21发布

问题的详细解释可以理解这个问题 ,因为用户不得不添加的图像来解释它更好。

我加载HTML内容在我的WebView。 我的布局具有许多视图和web视图是内部滚动型地方(按照布局要求)。 请不要为回答- "Don't put WebView inside ScrollView" 。 我知道,它不是一个好东西放的WebView滚动型里面,但按规定我必须这样做。

所以,我已经离开片段(显示列表项)和右片段(从左边片列表项的选择显示数据所反映)。 现在,首先当我加载内WebV HTML内容显示它正确。 之后,当我刷新网页视图与新的HTML内容出现问题。

假设,我的第一个HTML内容的100行它正确地显示,然后我重装的WebView与我的新的HTML内容是40行那么的WebView不收缩,装配与40行的内容,它仍然只要100线示出了在底部白色/空白。

所以,似乎WebView中能够从更少的内容被预先加载到更多的内容,但无法重新大小本身当含量小于先前加载的内容重新大小本身。

我曾尝试过很多办法,

  • 添加android:hardwareAccelerated="true"的清单
  • 此博客
  • 也有许多其他的方式和博客
  • 此外,我曾试图用mWebView.clearView(); 这将导致重新大小的WebView的大小,但在倍的WebView开始闪烁这仅仅是烦人。 类似这个视频

但是,找不到任何妥善的解决办法。 如果有人对你有同样的问题之前,让我知道我可以申请的最佳解决方案。

UPDATE -

进一步谷歌搜索后,似乎这是在蜂窝众所周知的问题。 这个问题也表明了类似的问题。

Answer 1:

似乎没有办法调整的WebView(减少)的大小动态,一旦其加载。 所以,这可能会解决我的问题唯一的办法就是重装完整的WebView。

所以,与其定义XML中的片段,我的每一次动态添加片段改变了我的东西。 通过这我能解决我的问题。



Answer 2:

这是一个已知问题WebView和一些可用的解决方案并不适用于所有的设备上运行。

我尝试了很多解决方案,SO给出答案,也搜查了互联网,但他们没有太为我工作。

我结束了, 取出的WebView,并在同一位置再次布局添加的WebView中

下面是演示代码,

        final RelativeLayout rl = new RelativeLayout(this);
        myWebView = new WebView(this);
        myWebView.setBackgroundColor(Color.GRAY);
        myWebView.loadUrl("file:///android_asset/1.htm");
        rl.addView(myWebView);  // ******* Added At Index 0
        Button btn = new Button(this);
        btn.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                if (!flg) {
                    rl.removeViewAt(0);
                    myWebView = new WebView(MainActivity.this);
                    myWebView.setBackgroundColor(Color.GRAY);
                    myWebView.loadUrl("file:///android_asset/3.htm");
                    rl.addView(myWebView, 0, new RelativeLayout.LayoutParams(
                            new LayoutParams(LayoutParams.FILL_PARENT,
                                    LayoutParams.WRAP_CONTENT)));
                    flg = true;
                } else {
                    rl.removeViewAt(0);
                    myWebView = new WebView(MainActivity.this);
                    myWebView.setBackgroundColor(Color.GRAY);
                    myWebView.loadUrl("file:///android_asset/1.htm");
                    rl.addView(myWebView, 0, new RelativeLayout.LayoutParams(
                            new LayoutParams(LayoutParams.FILL_PARENT,
                                    LayoutParams.WRAP_CONTENT)));
                    flg = false;
                }
            }
        });
        rl.addView(btn); // ******* Added At Index 1
        setContentView(rl);


Answer 3:

家伙,看来我找到了本地内容的解决方案。 你应该在加载新的内容之前,只需要调用webView.reload() - 不知何故它的大小调整,没有任何闪烁。



Answer 4:

在这里,我已经改变了的WebView取决于softkeyboard显示的高度

  activityRootView = (RelativeLayout) findViewById(R.id.webview1);
            mWebView = (WebViewEx) WebViewActivity.this.findViewById(R.id.webview);

            activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new    OnGlobalLayoutListener() {
                public void onGlobalLayout() {
                    Rect r = new Rect();
                    //r will be populated with the coordinates of your view that area  still visible.
                    activityRootView.getWindowVisibleDisplayFrame(r);

                    int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
                    if(heightDiff != lastValue) {
                        if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
                            Log.i("Screen Size Changed","KeyBoard Displaying"+ r.bottom);

                            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                             params.height=r.bottom;
                             mWebView.setLayoutParams(params);
                            //appView.sendJavascript("onKeyBoardShow(" + r.bottom + ");");
                        } else {
                           /// appView.sendJavascript("onKeyBoardHide();");
                            Log.i("Screen Size Changed","KeyBoard not displaying" +r.bottom);
                            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                             params.height=r.bottom;
                             mWebView.setLayoutParams(params);
                        }
                        lastValue = heightDiff;
                    }
                 }
            });


Answer 5:

我还没有尝试过,但你为什么不给通过重新设置weblayout PARAMS,U加载新的内容之前一试。 即设置高度和宽度wrapcontent。 如果成功找到请回复。 如果不会找到成功最好去javascipt的



Answer 6:

我把我的WebView到飘的知名度,同时它不见了内容加载到WebView中。 然后,我的可见性设置为可见让DOM和JS负荷后,它似乎正确绘制长度。 由于没有像onPageFinished回调确定何时JS执行完毕,我给的WebView之前,我的可见性设置为true的一秒的延迟。 这种解决方法足以满足我的目的,所以希望它解决了一些你们的需求!



Answer 7:

每次创造的WebView的对象,并给它的参数是一个痛苦而不是你可以做下面的步骤,它会工作

  • 把一个空白的HTML文件中的assets文件夹,并给它一个名字empty.html

  • 调用webview.loadUrl("file:///android_asset/empty.html");

  • 现在加载您的内容。

网页视图将缩小它的高度。

确保你没有把任何内容empty.html



Answer 8:

做的魔力! 它说

Android的特性:机器人:layout_weight =“1布局应该工作...

就我而言,Webview是在RelativeLayout的。 这样做THI机器人:layout_height =“WRAP_CONTENT”工作就像一个魅力:)



Answer 9:

作为@Ankit指出,去一个空白页面可能会有帮助。 “有关:空白”比较好,虽然。



文章来源: How to Shrink WebView size dynamically according to its content?