Obtendo posição documento em um WebView?
Pergunta
Para colocá-lo simples: eu quero marcar a posição atual (provavelmente várias posições) em um arquivo html exibido em um WebView para mais tarde restaurá-lo. Qualquer pequena dica ajudaria. :)
Solução
Se por "a posição atual" você quer dizer um lugar ponto em uma determinada página, eu não acredito que é possível ... pelo menos não puramente de Java. Todo o WebKit API exposta a Java carece de muita coisa que lida com o conteúdo das páginas.
Se você tem controle sobre o conteúdo da página, e não há uma maneira de saber essas posições através de páginas em JavaScript, você pode:
Etapa # 1: Use WebView#addJavascriptInterface()
para adicionar um objeto com algum tipo de método recordPosition()
, salvando as informações onde for mais apropriado
Etapa # 2:. Criar uma função JavaScript que chamadas recordPosition()
no objeto injetado
e, em seguida:
Etapa # 3a: gatilho que função JavaScript da própria Javascript (por exemplo, com base em um clique), ou
Etapa # 3-B:. Chamada loadUrl("javascript:...");
em seu WebView
, onde ...
é substituído pelo código Javascript para acionar a função Javascript a partir da etapa # 2
Restaurar estas posições teria que trabalhar da mesma maneira:. Tem Javascript fazer as restaurações reais, possivelmente desencadeada por código Java
Note que eu não tenho idéia se o que você quer (obter / definir a posição atual) está disponível a partir de Javascript, como eu não sou muito de um codificador no navegador.
Outras dicas
A abordagem que eu tomei foi a seguinte:
No método onSaveInstanceState()
, calcular quão baixo a página que o usuário tivesse rolado.
int contentHeight = webView.getContentHeight();
int scrollY = webView.getScrollY();
float scrollPercent = ((float) scrollY / ((float) contentHeight));
Stash que no pacote. Ao restaurar a página no método onCreate()
, esperar a página para carregar acabamento (em WebClient.onPageFinished()
), vá até a posição gravada:
int contentHeight = webView.getContentHeight();
int y = (int) ((float) contentHeight * scrollPercent);
webView.scrollTo(0, y);
- Usando um
float
e calcular um rácio obras no caso de inversão entre paisagem e retrato. - trabalho Maio bem o suficiente , mas não perfeitamente quando misturado com imagens redimensionamento automático.
- Scale também pode ser levado em conta. I tendem a esconder a escala em uma preferência no método
onPause()
, e depoiswebView.setInitialScale(scale)
antes de iniciar o carregamento da página. - Eu descobri que definir a visão da web para invisível quando olhares
scrollPercent > 0
melhores.