Não vou apresentar todos os hacks necessários que devem ser feitos para renderizar páginas html corretamente em diferentes versões de webview do Android, mas hoje eu tive essa ideia e gostaria de compartilhá-la.
Se você está trabalhando em um projeto que inclui Android webview e luta com diferentes bugs (principalmente bugs CSS) por causa da falta de recursos no webview, talvez você possa definir o agente do usuário dinamicamente, dependendo da versão do Android em que está executando seu aplicativo.
Exemplo mínimo:
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
public class WebViewActivity extends Activity {
private WebView webView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webview);
webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
//THE IMPORTANT PIECE HERE
webView.getSettings().setUserAgentString("youruseragent"+Build.VERSION.RELEASE);
webView.loadUrl("http://www.google.com");
}
}
No lado do javascript, sugiro usar uma função como a seguinte:
function getAndroidVersion (userAgent) {
if (userAgent.indexOf (“youruseragent”)> = 0)
return parseFloat (userAgent.slice (userAgent.indexOf (“youruseragent”) + 13));
// 13 = “seuagente de usuário” .length ()
else return -1;
};
Com esta função acima, você pode obter a versão do Android com um decimal como 4.1 ou 2.3 etc.
Claro que você pode manipular a função para obter a versão completa do Android, exemplo: 4.1.2 ou 2.3.3 etc., alterando a função como abaixo :
function getAndroidVersion (userAgent) {
if (userAgent.indexOf (“youruseragent”)> = 0)
return userAgent.slice (userAgent.indexOf (“youruseragent”) + 13);
// 13 = “seuagente de usuário” .length ()
else return -1;
};
A função retornará -1 se o agente do usuário não estiver contendo a string personalizada do agente do usuário “youruseragent”.
No meu caso, mudei, por exemplo, uma visão inteira por causa de um bug CSS (elementos fixos de posição não rolam verticalmente nas versões do Android <3).
Mas essa estratégia pode ser usada para todos os tipos de problemas com diferentes versões de webview.
Espero que possa ajudar a qualquer pessoa, especialmente aqueles que visam versões mais antigas do webview.