Подтвердить что ты не робот

Как уменьшить размер 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. Этот вопрос также указывает на аналогичную проблему.

4b9b3361

Ответ 1

Невозможно изменить размер WebView (уменьшить) его размер динамически после его загрузки. Итак, единственное, что могло решить мою проблему, - это перезагрузка полного WebView. Итак, вместо определения фрагмента в xml я изменил свой материал, добавив Fragment динамически каждый раз. Благодаря чему я смог решить мою проблему.

Надеюсь, это поможет другим в будущем!

Ответ 2

Это известная проблема с 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);

Ответ 3

ребята, похоже, я нашел решение для локального контента. Вы должны просто вызвать webView.reload() перед загрузкой нового контента - так или иначе он изменяет размер без мигания.

Ответ 4

Этот сделать волшебство! В нем говорится:

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

  • загрузите свой контент.

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

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

Ответ 8

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

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

Ответ 9

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