it-roy-ru.com

Как динамически уменьшить размер WebView в соответствии с его содержимым?

Подробное объяснение проблемы можно понять из этого вопроса поскольку пользователь добавил изображение, чтобы объяснить его лучше.

Я загружаю HTML-контент в моем WebView. Мой макет имеет много видов, и WebView находится внутри ScrollView (согласно требованию макета). Пожалуйста, не отвечайте как - "Don't put WebView inside ScrollView". Я знаю, что не стоит помещать WebView в ScrollView, но в соответствии с требованиями мне нужно это сделать. 

Итак, у меня есть Левый фрагмент (показывает элементы списка) и Правый фрагмент (показывает данные, отраженные при выборе элемента списка из левого фрагмента). Теперь, во-первых, когда я загружаю HTML-контент внутри WebV, он показывает корректно. После этого, когда я обновляю WebView новым Html-контентом, возникает проблема.

Предположим, мой первый HTML-контент состоит из 100 строк, которые он показывает правильно, а затем я перезагружаю WebView с моим новым HTML-контентом, который состоит из 40 строк, после чего WebView не сжимается и не вписывается в контент с 40 строками, он по-прежнему сохраняется до 100 линии, показывающие белое/пустое пространство внизу.

Таким образом, кажется, что WebView может изменить свой размер с меньшего количества контента, который ранее был загружен с большим количеством контента, но не может изменить свой размер, когда контент меньше, чем ранее загруженный контент.

Я перепробовал много способов,

  • Добавление Android:hardwareAccelerated="true" в манифест
  • Этот блог
  • Также много других способов и блог
  • Также я попытался использовать mWebView.clearView();, которая приводит к изменению размера WebView, но иногда WebView начинает мигать, что просто раздражает. Аналогично это видео

Но не смог найти правильного решения. Если у кого-то из вас возникла такая же проблема, просто дайте мне знать лучшее решение, которое я мог бы применить.

Обновление -

После дальнейшего поиска в Google кажется, что это хорошо известная проблема в Honeycomb. Этот вопрос также указывает на аналогичную проблему.

24
Lalit Poptani

Кажется, что нет способа изменить размер WebView (уменьшить) его размер динамически после его загрузки. Таким образом, единственное, что могло решить мою проблему, это перезагрузить полный WebView.

Таким образом, вместо определения фрагмента в XML, я изменил свои вещи, динамически добавляя фрагмент каждый раз. С помощью которого я смог решить мою проблему.

5
Lalit Poptani

Это известная проблема с WebView, и некоторые доступные решения не работают на всех устройствах.

Я перепробовал множество решений, приведенных в SO ответах, а также искал в Интернете, но ни один из них не помог мне.

Я закончил, удаляя WebView и снова добавляя WebView в ту же позицию в Layout

Вот этот демонстрационный код,

        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

Я установил видимость моего WebView на Gone и загружаю содержимое в WebView, пока оно отсутствует. Затем я установил видимость видимым после загрузки DOM и JS, и он, кажется, правильно рисует длину. Поскольку нет обратного вызова, такого как onPageFinished, для определения того, когда JS завершил выполнение, я даю WebView задержку в одну секунду, прежде чем установить видимость в true. Этот обходной путь подходит для моих целей, так что, надеюсь, он удовлетворит потребности некоторых из вас, ребята!

0
Steven

Как отметил @Ankit, переход на пустую страницу может помочь. "about: blank" лучше, хотя.

0
fiorentinoing

Это сделать магию! Это говорит

Свойство Android: Android: layout_weight = "1 в макете должно работать ...

В моем случае WebView находится в RelativeLayout. Так поступает Android: layout_height = "wrap_content" работает как шарм :)

0
theWook

Каждый раз создавать объект веб-просмотра и задавать его параметры - это боль, вместо этого вы можете выполнить следующие шаги, и он будет работать

  • поместите пустой HTML-файл в папку assets и дайте ему имя empty.html

  • вызов webview.loadUrl("file:///Android_asset/empty.html");

  • теперь загрузите ваш контент.

Веб-просмотр уменьшит его высоту.

Убедитесь, что вы не помещаете любой контент в empty.html

0
Ankit

Здесь я изменил высоту веб-просмотра в зависимости от отображения программной клавиатуры

  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;
                    }
                 }
            });
0
Parikshit Singh Shekhawat

я не пробовал, но почему бы вам не попробовать, снова установив параметры weblayout, прежде чем загружать новое содержимое. т.е. установите высоту и ширину для обтекания. если успех найден, пожалуйста, ответьте. если не найдете успеха, лучше отправляйтесь на javascipt 

0
Sush