Как уменьшить размер 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. Этот вопрос также указывает на аналогичную проблему.
Ответы
Ответ 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 и даете его параметру, это боль, а вы можете сделать следующие шаги, и он будет работать
Веб-просмотр уменьшит его высоту.
Убедитесь, что вы не помещаете любой контент в 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" лучше, тем не менее.