web-dev-qa-db-ja.com

コンテンツに応じてWebViewのサイズを動的に縮小する方法は?

問題の詳細な説明は この質問 から理解できます。ユーザーがより良い説明のために画像を追加したからです。

WebViewにHTMLコンテンツをロードしています。私のレイアウトには多くのビューがあり、WebViewはScrollView内に配置されています(レイアウト要件に従って)。 -_"Don't put WebView inside ScrollView"_と答えないでください。 ScrollView内にWebViewを配置するのは良いことではないことを知っていますが、要件ごとにそうする必要があります。

したがって、左のフラグメント(リストアイテムを表示)と右のフラグメント(左のフラグメントからのリストアイテムの選択に反映されたデータを表示)があります。さて、まずWebV内でHtmlコンテンツをロードすると、正しく表示されます。その後、新しいHTMLコンテンツでWebViewを更新すると、問題が発生します。

最初のHtmlコンテンツが正しく表示される100行であり、その後40行の新しいHtmlコンテンツでWebViewを再ロードすると、WebViewは縮小せず、40行のコンテンツにフィットしますが、100下部に白い/空白のスペースを示す線。

したがって、WebViewは以前にロードされたより少ないコンテンツからより多くのコンテンツにそれ自体のサイズを変更できるように見えますが、コンテンツが以前にロードされたコンテンツよりも小さい場合、それ自体のサイズを変更できません。

私は多くの方法を試しましたが、

  • マニフェストに_Android:hardwareAccelerated="true"_を追加する
  • このブログ
  • 他の多くの方法とブログ
  • また、WebViewのサイズを変更するmWebView.clearView();を使用しようとしましたが、WebViewが点滅を開始することがあり、これは単に迷惑です。 this video と同様

しかし、適切な解決策が見つかりませんでした。もしあなたの誰かが以前に同じ問題を抱えているなら、私が適用できる最善の解決策を教えてください。

更新-

さらにグーグルで調べたところ、これはハニカムでよく知られている問題のようです。 この質問 も同様の問題を示しています。

25
Lalit Poptani

一度ロードすると、WebViewのサイズを動的に変更(縮小)する方法はないようです。したがって、私の問題を解決できるのは、完全なWebViewをリロードすることだけです。

そのため、XMLでフラグメントを定義する代わりに、毎回動的にフラグメントを追加することで、自分のものを変更しました。これにより、問題を解決できました。

6
Lalit Poptani

これは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);
1
MKJParekh

みんな、ローカルコンテンツの解決策を見つけたようです。新しいコンテンツをロードする前にwebView.reload()を呼び出す必要があります-なんとなく点滅せずにサイズ変更を行います。

1
Vladimir Ivanov

ここでは、ソフトキーボードの表示に応じてウェブビューの高さを変更しました

  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;
                    }
                 }
            });

WebViewの可視性をGoneに設定し、WebViewがなくなっている間にコンテンツをWebViewにロードします。次に、DOMとJSをロードした後に可視性を可視に設定すると、長さが正しく描画されるようです。 JSがいつ実行を終了したかを判断するためのonPageFinishedのようなコールバックがないため、可視性をtrueに設定する前にWebViewに1秒の遅延を与えます。この回避策は私の目的には十分であるため、皆さんの一部のニーズに応えることを願っています!

0
Steven

@Ankitが指摘したように、空のページに移動すると役立つ場合があります。ただし、「about:blank」の方が優れています。

0
fiorentinoing

This 魔法をかける!それは言う

Androidプロパティ:Android:layout_weight = "レイアウトの1は機能するはずです...

私の場合、WebViewはRelativeLayoutにあります。そのため、thi Android:layout_height = "wrap_content"を実行することは魅力的でした:)

0
theWook

Webviewのオブジェクトを作成してそのパラメータを与えるたびに、代わりに次の手順を実行できますが、それは動作します

  • assetsフォルダーに空のhtmlファイルを置き、名前に_empty.html_を付けます

  • webview.loadUrl("file:///Android_asset/empty.html");を呼び出します

  • コンテンツをロードします。

Webviewは高さを縮小します。

入れない _empty.html_のコンテンツであることを確認してください

0
Ankit

私は試していませんが、新しいコンテンツをロードする前に、weblayout paramsを再度設定してみてください。つまり、高さと幅をwrapcontentに設定します。成功した場合は返信してください。成功が見つからない場合は、javasciptをお勧めします

0
Sush