148 votes

Android WebView traitant les changements d'orientation

Je viens de commencer à travailler avec la vue Web. Le problème est la performance après la rotation. WebView doit recharger la page, ce qui peut être un peu fastidieux.

Quelle est la meilleure façon de gérer un changement d'orientation sans recharger la page à chaque fois?

91voto

Totach Points 790

Si vous ne voulez pas la WebView pour recharger sur les changements d'orientation de simplement remplacer onConfigurationChanged dans votre classe d'Activité:

@Override
public void onConfigurationChanged(Configuration newConfig){        
    super.onConfigurationChanged(newConfig);
}

Et jeu android:configChanges attribut dans le manifeste:

<activity android:name="..."
          android:label="@string/appName"
          android:configChanges="orientation|screenSize"

pour plus d'infos, voir:
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange

http://developer.android.com/intl/de/reference/android/app/Activity.html#ConfigurationChanges

70voto

KWright Points 623

Cela peut être géré en écrasant onSaveInstanceState(Bundle outState) dans votre activité et en appelant saveState depuis la vue Web:

    protected void onSaveInstanceState(Bundle outState) {
      webView.saveState(outState);
   }
 

Ensuite, récupérez ceci dans votre onCreate après que la webview ait été regonflée bien sûr:

 public void onCreate(final Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.blah);
   if (savedInstanceState != null)
      ((WebView)findViewById(R.id.webview)).restoreState(savedInstanceState);
}
 

40voto

Blackhex Points 763

Ce blog est très utile en la matière: http://www.devahead.com/blog/2012/01/preserving-the-state-of-an-android-webview-on-screen-orientation-change/ . Cela fonctionne même pour les variables JavaScript, etc.

24voto

Tinashe Points 135

La meilleure réponse à cette question est de suivre la documentation Android trouvée ici. En gros, cela empêchera Webview de se recharger:

 <activity android:name=".MyActivity"
      android:configChanges="orientation|screenSize"
      android:label="@string/app_name">

@Override
 

void onConfigurationChanged public (Configuration newConfig) {super.onConfigurationChanged (newConfig);

 // Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
    Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
    Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
 

}

5voto

Joe D'Andrea Points 3588

J'ai essayé d'utiliser onRetainNonConfigurationInstance (retour de la WebView), puis le récupérer avec getLastNonConfigurationInstance pendant onCreate et re-affectation.

Ne semble pas fonctionner pour l'instant. Je ne peux pas aider mais je pense que je suis vraiment très proche! Jusqu'à présent, je viens d'obtenir un blanc/fond blanc WebView à la place. Poster ici dans l'espoir que quelqu'un peut aider à pousser cette un passé la ligne d'arrivée.

Peut-être que je ne devrais pas être en train de passer la WebView. Peut-être un objet dans la WebView?

L'autre méthode que j'ai essayé - pas mon préféré - est à paramétrer dans l'activité:

 android:configChanges="keyboardHidden|orientation"

... et puis de faire à peu près rien ici:

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  // We do nothing here. We're only handling this to keep orientation
  // or keyboard hiding from causing the WebView activity to restart.
}

Cela fonctionne, mais il pourrait ne pas être considéré comme une meilleure pratique.

Pendant ce temps, j'ai aussi un seul ImageView que je veux automatiquement mise à jour en fonction de la rotation. Cela s'avère être très facile. Sous mon res le dossier, j'ai drawable-land et drawable-port pour tenir paysage/portrait variations, puis-je utiliser R.drawable.myimagename pour l' ImageView's source et Android "fait la bonne chose" - yay!

... sauf quand vous regardez pour les modifications de configuration, puis il ne le fait pas. :(

Donc, je suis en désaccord. Utilisation onRetainNonConfigurationInstance et de l' ImageView rotation des œuvres, mais WebView persistance n'est pas ... ou utiliser onConfigurationChanged et la WebView reste stable, mais la ImageView n'est pas mise à jour. Que faire?

Une dernière remarque: Dans mon cas, forçant l'orientation n'est pas un compromis acceptable. Nous voulons vraiment gracieusement le soutien de la rotation. Un peu comme la façon dont le Navigateur Android app ne! ;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X