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

226
21

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


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

спросил(а) 2013-03-21T14:35:00+04:00 8 лет, 4 месяца назад
1
Решение
109

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

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

ответил(а) 2013-04-01T08:01:00+04:00 8 лет, 3 месяца назад
63

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


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



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

ответил(а) 2014-07-25T10:41:00+04:00 6 лет, 12 месяцев назад
63

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

ответил(а) 2013-05-31T10:38:00+04:00 8 лет, 1 месяц назад
64

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

ответил(а) 2013-03-21T16:06:00+04:00 8 лет, 4 месяца назад
45

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

ответил(а) 2015-05-25T18:02:00+03:00 6 лет, 2 месяца назад
45

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


  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-29T15:41:00+04:00 6 лет, 9 месяцев назад
45

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


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


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


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


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


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

ответил(а) 2014-03-10T10:37:00+04:00 7 лет, 4 месяца назад
46

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

ответил(а) 2013-09-10T21:43:00+04:00 7 лет, 10 месяцев назад
46

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

ответил(а) 2013-03-22T11:28:00+04:00 8 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема