O problema é o desempenho após a rotação. O WebView precisa recarregar a página, o que pode ser um pouco entediante.
Qual é a melhor maneira de lidar com uma mudança de orientação sem recarregar a página da fonte toda vez?
android
webview
orientation
glennanthonyb
fonte
fonte
Respostas:
Se você não deseja que o WebView seja recarregado com alterações de orientação, substitua onConfigurationChanged na sua classe Activity:
E defina o atributo android: configChanges no manifesto:
para obter mais informações, consulte:
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
https://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges
fonte
configChanges
atributo será adicionado à subclasse. Atividade 2) Se seu aplicativo depender de vários projetos, oconfigChanges
atributo será adicionado ao manifesto daquele no topo da árvore de dependência (que pode não ser o projeto que contém a classe Activity).onConfigurationChanged
substituição de método é inútil.Editar: este método não funciona mais como indicado nos documentos
Resposta original:
Isso pode ser tratado sobrescrevendo
onSaveInstanceState(Bundle outState)
sua atividade e chamando asaveState
partir da visualização na web :Em seguida, recupere isso no seu onCreate depois que a visualização na web tiver sido inflada novamente, é claro:
fonte
A melhor resposta para isso é seguir a documentação do Android encontrada aqui Basicamente, isso impedirá o recarregamento do Webview:
Opcionalmente , você pode corrigir anomalias (se houver) substituindo
onConfigurationChanged
na atividade:fonte
Tentei usar onRetainNonConfigurationInstance (retornando o WebView ) e recuperá-lo com getLastNonConfigurationInstance durante onCreate e redesigná-lo.
Ainda não parece funcionar. Eu não posso ajudar, mas acho que estou realmente perto! Até agora, recebi apenas um WebView em branco / fundo branco em . Postando aqui na esperança de que alguém possa ajudar a empurrar este além da linha de chegada.
Talvez eu não devesse estar passando no WebView . Talvez um objeto do WebView ?
O outro método que tentei - não o meu favorito - é definir isso na atividade:
... e não faça praticamente nada aqui:
Isso funciona, mas pode não ser considerado uma prática recomendada .
Enquanto isso, também tenho um único ImageView que quero atualizar automaticamente, dependendo da rotação. Isso acaba sendo muito fácil. Na minha
res
pasta, tenhodrawable-land
edrawable-port
mantenha variações de paisagem / retrato, depois usoR.drawable.myimagename
a fonte do ImageView e o Android "faz a coisa certa" - sim!... exceto quando você observa mudanças na configuração, isso não acontece. :(
Então, eu estou em desacordo. Use onRetainNonConfigurationInstance e a rotação do ImageView funciona, mas a persistência do WebView não ... ou use onConfigurationChanged e o WebView permanece estável, mas o ImageView não é atualizado. O que fazer?
Uma última observação: no meu caso, forçar a orientação não é um compromisso aceitável. Nós realmente queremos apoiar graciosamente a rotação. Mais ou menos como o aplicativo do Navegador Android funciona! ;)
fonte
Um compromisso é evitar a rotação. Adicione isso para corrigir a atividade apenas na orientação Retrato.
fonte
A melhor maneira de lidar com alterações de orientação e impedir a recarga do WebView no Rotate.
Com isso em mente, para impedir que onCreate () seja chamado toda vez que você altera a orientação, é necessário adicionar
android:configChanges="orientation|screenSize" to the AndroidManifest.
ou apenas ..
fonte
Basta escrever as seguintes linhas de código no seu arquivo de manifesto - nada mais. Realmente funciona:
fonte
Compreendo que isso seja um pouco tarde, no entanto, esta é a resposta que eu usei ao desenvolver minha solução:
AndroidManifest.xml
WebClient.java
fonte
Você pode tentar usar
onSaveInstanceState()
eonRestoreInstanceState()
em sua Atividade para ligarsaveState(...)
erestoreState(...)
em sua instância do WebView.fonte
É 2015, e muitas pessoas estão procurando uma solução que ainda funcione nos telefones Jellybean, KK e Lollipop. Depois de muita luta, encontrei uma maneira de preservar intacta a visualização na web depois que você altera a orientação. Minha estratégia é basicamente armazenar a visualização da web em uma variável estática separada em outra classe. Em seguida, se ocorrer rotação, desanexo a visualização da web da atividade, espero a conclusão da orientação e reconecto a visualização da web à atividade. Por exemplo ... primeiro coloque isso no seu MANIFEST (keyboardHidden e teclado são opcionais):
Em uma CLASSE DE APLICAÇÃO SEPARADA, coloque:
Em ACTIVITY coloque:
Finalmente, o XML simples:
Há várias coisas que podem ser aprimoradas em minha solução, mas eu já gastei muito tempo, por exemplo: uma maneira mais curta de validar se a Atividade foi iniciada pela primeira vez, em vez de usar o armazenamento SharedPreferences. Essa abordagem preserva a visualização na web intacta (afaik), suas caixas de texto, rótulos, interface do usuário, variáveis javascript e estados de navegação que não são refletidos pelo URL.
fonte
A única coisa que você deve fazer é adicionar esse código ao seu arquivo de manifesto:
fonte
Atualização: a estratégia atual é mover a instância do WebView para a classe Application, em vez de fragmento retido quando desanexado e reconectar no currículo, como Josh faz. Para impedir que o Aplicativo seja fechado, você deve usar o serviço em primeiro plano, se desejar manter o estado quando o usuário alternar entre aplicativos.
Se você estiver usando fragmentos, poderá usar a instância de retenção do WebView. A visualização da web será mantida como membro da instância da classe. No entanto, você deve anexar a exibição da Web no OnCreateView e desanexá-lo antes do OnDestroyView para impedir sua destruição com o contêiner pai.Créditos PS: vá para a resposta do kcoppockQuanto a 'SaveState ()', ele não funciona mais de acordo com a documentação oficial :
fonte
setRetainInstance
mantém o fragmento, a exibição (e, portanto, o WebView) ainda é destruída.Esses métodos podem ser substituídos em qualquer atividade, mas basicamente permitem salvar e restaurar valores toda vez que uma atividade é criada / destruída, quando a orientação da tela muda, a atividade é destruída e recriada em segundo plano; portanto, você pode usar esses métodos para armazenar / restaurar temporariamente os estados durante a alteração.
Você deve examinar mais profundamente os dois métodos a seguir e verificar se ele se encaixa na sua solução.
http://developer.android.com/reference/android/app/Activity.html
fonte
A melhor solução que encontrei para fazer isso sem vazar a
Activity
referência anterior e sem definir oconfigChanges
.. é usar um MutableContextWrapper .Eu implementei isso aqui: https://github.com/slightfoot/android-web-wrapper/blob/48cb3c48c457d889fc16b4e3eba1c9e925f42cfb/WebWrapper/src/com/example/webwrapper/BrowserActivity.java
fonte
Essa é a única coisa que funcionou para mim (eu até usei o estado da instância de salvamento,
onCreateView
mas não era tão confiável).Fiz um titular Singleton para o estado do WebView. O estado é preservado enquanto o processo do aplicativo existir.
EDIT: O
loadDataWithBaseURL
não era necessário, funcionou tão bem com apenasEmbora eu tenha lido isso, não necessariamente funciona bem com cookies.
fonte
tente isso
fonte
Esta página resolve meu problema, mas preciso fazer pequenas alterações na inicial:
Esta parte tem um pequeno problema para mim isso. Na segunda orientação, altere o aplicativo finalizado com ponteiro nulo
usando isso funcionou para mim:
fonte
Você deve tentar o seguinte:
onServiceConnected
método, obtenha o WebView e chame osetContentView
método para renderizar seu WebView.Eu testei e funciona, mas não com outros WebViews como XWalkView ou GeckoView.
fonte
fonte
Eu gosto desta solução http://www.devahead.com/blog/2012/01/preserving-the-state-of-an-android-webview-on-screen-orientation-change/
Segundo ele, reutilizamos a mesma instância do WebView. Permite salvar o histórico de navegação e rolar a posição na alteração da configuração.
fonte