Веб-представление Android: обработка изменений ориентации

Используйте DateFormat... Текущий стандарт до желанной отсрочки Joda.

145
задан Jonathan Soifer 21 May 2016 в 13:50
поделиться

6 ответов

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);    
}

@Override
protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);    
}

Эти методы могут быть переопределены для любого действия, они просто позволяют сохранять и восстанавливать значения каждый раз, когда действие создается / уничтожается, когда ориентация экрана изменяется, действие уничтожается и воссоздается в фон, поэтому вы можете использовать эти методы для временного сохранения / восстановления состояний во время изменения.

Вам следует глубже изучить два следующих метода и посмотреть, подходит ли он вашему решению.

http: // developer .android.com / reference / android / app / Activity.html

1
ответ дан 23 November 2019 в 22:50
поделиться

Один из компромиссов - избежать вращения. Добавьте это, чтобы исправить действие только для книжной ориентации.

android:screenOrientation="portrait"
3
ответ дан 23 November 2019 в 22:50
поделиться

Вы можете попробовать использовать onSaveInstanceState () и onRestoreInstanceState () в своей деятельности для вызова saveState (...) и restoreState (...) в вашем экземпляре WebView.

2
ответ дан 23 November 2019 в 22:50
поделиться

Я пробовал использовать наRetainNonConfigurationInstance (возвращая WebView), а затем получить его обратно с помощью getLastNonConfigurationInstance во время onCreate и переустановить.

Похоже, пока не работает. Не могу не думать, что я действительно близок! Пока что я просто получаю пустой/белый фон WebView вместо этого. Пост здесь в надежде, что кто-нибудь сможет помочь протолкнуть этот за финишную черту.

Может, мне не стоит проходить WebView. Возможно, объект изнутри WebView?

Другой метод, который я пробовал - не мой любимый - это установить это в деятельности:

 android:configChanges="keyboardHidden|orientation"

... и затем ничего не делать здесь:

@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.
}

Это работает, но это может не считаться лучшей практикой.

Тем временем, у меня также есть один ImageView, который я хочу автоматически обновлять в зависимости от вращения. Оказалось, что это очень просто. В моей папке res у меня есть drawable-land и drawable-port для хранения вариаций пейзажа/портрета, затем я использую R.drawable.myimagename для источника ImageView и Android "делает правильные вещи" - ура!

... за исключением того, что когда вы смотрите на изменения в конфигурации, то это не так. :(

Так что я нахожусь в разногласиях. Используйте наRetainNonConfigurationInstance и вращение ImageView работает, но WebView стойкость не ... или используйте наConfigurationChanged и WebView остается стабильным, но ImageView не обновляется. Что делать?

Последнее замечание: В моем случае, принудительная ориентация не является приемлемым компромиссом. Мы действительно хотим изящно поддержать вращение. Похоже на то, что делает приложение Android Browser! ;)

5
ответ дан 23 November 2019 в 22:50
поделиться

Если вы не хотите, чтобы WebView перезагружался при изменении ориентации, просто переопределите onConfigurationChanged в классе Activity:

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

И установите атрибут android:configChanges в манифесте:

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

подробнее смотрите:
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange

https://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges

88
ответ дан 23 November 2019 в 22:50
поделиться

Изменить: этот метод больше не работает так, как указано в docs


Исходный ответ:

Это можно решить, перезаписав onSaveInstanceState (Bundle outState) в своей деятельности и вызвав saveState из веб-просмотра:

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

Затем восстановите это в своем onCreate после того, как веб-просмотр был повторно завышен, конечно:

public void onCreate(final Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.blah);
   if (savedInstanceState != null)
      ((WebView)findViewById(R.id.webview)).restoreState(savedInstanceState);
}
69
ответ дан 23 November 2019 в 22:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: