2010-01-14 23 views
1

Tout a commencé avec un simple WebView dans une application Android.De WebView erreurs à ImageView Cover-up à l'orientation de l'écran

Cette vue charge les informations d'une URL publique. Rien d'inhabituel ici.

Toutefois ... en cas d'interruption du réseau, vous pouvez facilement vous retrouver avec une erreur affichée en évidence dans le WebView.

Eh bien, ce n'est pas bon, non? Alors j'ai cherché les docs et ailleurs pour trouver un moyen de supprimer cela, ou de le piéger ... et je n'ai trouvé aucune piste. Avec cela, je me suis renseigné sur #android-dev sur IRC: Je sais environ WebView.onReceivedError, mais la partie visuelle peut-elle être supprimée? (Au lieu de cela, je voulais afficher un Dialog avertissement dudit problème de réseau, avec une option pour réessayer.)

Réponse: You can't. :(

Très bien. Le temps pour le plan B. Peut-être un ImageView pourrait remplir ce projet de loi?

En cas de type de erreur WebView, le ImageView peut être utilisé comme un rideau de fortune . il recouvre la WebView au début (avant l'URL est chargée), alors il disparaît pour révéler la WebView derrière. Si les WebView fonctionne, merveilleux! Mais si onReceivedError ki cks dans, nous remettons le rideau immédiatement et montrons le dialogue ci-dessus. Une fois que WebView obtient un onPageFinished, le rideau s'estompe une fois de plus.

... et CELA ... fonctionne MERIDENTEMENT!

Jusqu'à ce qu'on me demande de prendre en charge les changements d'orientation de l'écran. (Préfiguration: "Les choses sont descendues d'ici.")

Jusqu'à présent, l'application utilisait android:screenOrientation="portrait" dans l'activité principale du Manifeste. Donc, j'ai enlevé cette partie, et bien sûr, nous avons couru dans le fameux "l'activité est en cours de redémarrage" problème, qui souffle loin, puis ramène le WebView.

Bien sûr, ce n'est pas un problème en soi. C'est OS Android fonctionnant comme prévu.

En outre, nous voulons que le ImageView s'affiche correctement en fonction de l'orientation. Heureusement, nous avons alternate resources, nous pouvons tirer parti! Pendant ce temps, nous avons toujours ce WebView nous ne voulons pas recharger. Nous voulons qu'il soit laissé seul et laisser la vue faire son propre truc, que ce soit en portrait ou en paysage à l'époque.

Je trouve a few well-explained ways to handle screen orientation, plus j'ai déjà lu auteur MarkMurphy'seBooks (lecture fortement recommandé). Pourtant j'étais toujours coincé!Avec le ImageView maintenant dans le mélange, aucune des techniques semblent remplir la facture:

  1. mode portrait est Forcing, bien sûr, hors de question (ou est-ce?).

  2. android:configChanges="keyboardHidden|orientation" et onConfigurationChanged semblent prendre soin de la WebView, qui gère béatement l'écran redimensionner gracieusement sur elle-même. De cours, le ImageView n'obtient pas le mémo non plus, et il continue à utiliser sa ressource originale (portrait/paysage)!

    Un appel mal conçu pour activity.setRequestedOrientation(newConfig.orientation) dans le changement de configuration gestionnaire n'a pas aidé les choses.

  3. Depuis le WebView n'a pas besoin d'être persistaient entre les exécutions d'applications, onRetainNonConfigurationInstance ressemblait à une autre possibilité. Hélas, cela n'a pas semblé fonctionner non plus . Réinitialisation webview avec la dernière instance de nonconfig (depuis c'est tout ce que j'ai vraiment passé) a abouti à un vide WebView. Pas tout à fait ce que j'étais après.

    autre main, le ImageView semblait répondre bien à l'orientation changements. Allez comprendre.

  4. Comment sur onSaveInstanceState? Idem gotchas. WebView a une méthode saveState , mais il ne semble pas être l'enregistrer à un niveau assez profond pour garder la transition transparente. Si oui, alors il n'est probablement pas censé non plus, donc cela pourrait être le mauvais chemin à parcourir aussi.

Quant à la sagesse d'utiliser configChanges, the documentation recommends this very technique, en fait:

Comportement standard pour une activité est à détruire et recréés lorsque l'orientation des dispositifs est modifiée. Cette entraînera le WebView à recharger la page en cours . Si vous ne voulez pas que, vous pouvez définir votre Activité pour gérer les orientation et keyboardHidden modifications, puis il suffit de laisser le WebView seul. Il va automatiquement se réorienter comme il se doit.

Bien sûr I could also be committing some sort of pilot error ici, mais je n'ai pas encore compris ce que cela pourrait être.

J'ai lu et relu la documentation et j'ai essayé de toute façon de la résoudre par moi-même. Peut-être qu'il me manque quelque chose (évident?) Dans les documents, ou la solution n'est pas évidente (mais quelqu'un peut faire la lumière) ... ou ce n'est tout simplement pas possible. En espérant que ce n'est pas le dernier.

Les indices sont les bienvenus/appréciés!

Répondre

0

Heureux que vous aimez les livres!

Dans le chapitre sur la rotation, où je suppose que vous avez de nombreuses approches que vous avez essayé, vous remarquerez que le nouveau appelle la saveur setContentView(), rechargeant force la mise en page et donc obtenir la ressource appropriée. Vous, bien sûr, ne voulez pas faire cela en soi, parce que cela ferait souffler votre WebView.

Cependant, j'attendre qu'un appel à setImageResource() dans , pour votre ImageView, doit tirer dans la bonne version de votre « rideau ». Utilisez-le pour "retoucher" votre image à la bonne, et voir si cela aide.

+0

Salut Mark (vagues)! Yep, setContentView - J'évitais ça comme la peste (hehe). Croiriez-vous que j'ai cette ligne commentée dans onConfigurationChanged? 'curtain.setImageResource (R.drawable.curtain);' Raison: Il ne semblait pas faire quoi que ce soit. Je vais le regarder de plus près. –

+0

Pas de dés. C'est comme si je n'avais rien fait en faisant l'appel. Même si je simplifie le problème en le rendant juste sur l'ImageView et en le faisant basculer sur la rotation. Hmm ... –

+0

Hmmmm ... c'est bizarre. À titre de test, effectuez une copie légèrement modifiée de l'image de votre rideau sous un nouveau nom, et essayez de basculer entre les deux, plutôt que de vous fier aux ensembles de ressources. Je veux juste m'assurer que le problème est que vous n'obtenez pas le bon ensemble de ressources. Si setImageResource() sur l'image modifiée n'a aucun effet, cela signifie que votre ImageView n'est pas mis à jour pour une raison quelconque, ce qui nécessiterait un chemin de débogage différent pour être corrigé. – CommonsWare