27

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

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

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

最初のHtmlコンテンツが100行で正しく表示され、次にWebViewを40行の新しいHtmlコンテンツでリロードすると、WebViewは縮小せず、40行のコンテンツに適合しますが、100行のままです。下部に白/空白を示す線。

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

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

  • android:hardwareAccelerated="true"マニフェストの追加
  • このブログ
  • また、他の多くの方法とブログ
  • また、これを使用mWebView.clearView();してWebViewのサイズを変更しようとしましたが、WebViewが点滅し始めることがあります。これは単に煩わしいことです。このビデオに似ています

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

アップデート -

さらにグーグルした後、これはHoneycombでよく知られている問題のようです。この質問も同様の問題を示しています。

4

9 に答える 9

1

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

  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;
                    }
                 }
            });
于 2014-09-29T12:41:32.220 に答える
1

これは既知の問題で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);
于 2013-03-21T13:06:25.373 に答える
1

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

于 2013-05-31T07:38:12.293 に答える
0

これは魔法を行います!それは言う

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

私の場合、WebView は RelativeLayout にあります。したがって、この android:layout_height="wrap_content" を行うと、魅力のように機能しました:)

于 2014-07-25T07:41:19.313 に答える
0

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

于 2013-03-22T08:28:23.297 に答える
0

webview のオブジェクトを作成してそのパラメータを指定するたびに、次の手順を実行するとうまくいきます。

  • 空のhtmlファイルをassetsフォルダに入れて名前を付けます empty.html

  • 電話webview.loadUrl("file:///android_asset/empty.html");

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

Webview はその高さを縮小します。

コンテンツを入れていないことを確認してくださいempty.html

于 2014-03-10T07:37:47.560 に答える
0

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

于 2015-05-25T15:02:06.917 に答える