Можно ли проверить, был ли onCreate вызван из-за изменения ориентации?
Мне нужно действовать по-другому в методе onStart()
в зависимости от того, как был вызван onCreate()
в результате
из orientation change
или нет. Можно ли это проверить?
На самом деле мне нужно сделать something
, когда начинается действие , за исключением случая, когда пользователь меняет ориентацию.
Мне нужно четко различать случаи, когда пользователь просто переключился на другое приложение и вернулся обратно, или изменил ориентацию устройства.
Ответы
Ответ 1
public class MyActivity extends Activity {
boolean fromOrientation=false;
SharedPreferences myPrefLogin;
Editor prefsEditor;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
prefsEditor = myPrefLogin.edit();
myPrefLogin = this.getSharedPreferences("myPrefs", Context.MODE_WORLD_READABLE);
fromOrientation = myPrefLogin.getString("fromOrient", false);
if(fromOrientation) {
// do as per need--- logic of orientation changed.
} else {
// do as per need--- logic of default onCreate().
}
}
@Override
public Object onRetainNonConfigurationInstance() {
prefsEditor.putString("fromOrient", true);
prefsEditor.commit();
return null;
}
@Override
protected void onDestroy() {
if(fromOrientation) {
prefsEditor.putString("fromOrient", false);
prefsEditor.commit();
}
super.onDestroy();
}
}
флаг fromOrientation (сообщает, что состояние было изменено или было изменено)
выше, чем мы делали, например, по дефалуту, мы рассматриваем, что onCreate()
не вызывается из-за изменения ориентации. Если ориентация изменилась (onRetainNonConfigurationInstance()
), мы задаем значение флага, которое позволяет нам знать, вызывается ли onCreate()
из ориентации или нет.
И, наконец, onDestroy()
снова reset флаг ориентации.
Ответ 2
Следуя идее Нахтана, я написал следующее:
in onCreate():
if ( (oldConfigInt & ActivityInfo.CONFIG_ORIENTATION)==ActivityInfo.CONFIG_ORIENTATION ) {
// ... was rotated
} else {
// ... was not rotated
}
в onDestroy():
super.onDestroy();
oldConfigInt = getChangingConfigurations();
Ответ 3
Попробуйте getChangingConfigurations. Используйте это, чтобы обнаружить, когда действие уничтожается из-за изменения ориентации, установки флага и проверки этого флага при вызове onCreate.
Это имеет то преимущество, что позволяет вам знать, почему активность перезапускается без переопределения конфигурации ориентации в манифесте.
Ответ 4
Просто проверьте комплект: когда операция начинается, пакет будет равен нулю. Если есть изменение ориентации, оно должно быть не нулевым.
Из андроидных документов:
Если операция повторно инициализируется после того, как она была закрыта, этот пакет содержит данные, которые он недавно предоставил в onSaveInstanceState (Bundle). Примечание: В противном случае оно равно null.
Изменить: Я не думаю, что вам нужно предоставить пакет в onSaveInstanceState, чтобы он был не нулевым после изменения ориентации, но это было бы тривиально.
Ответ 5
Как говорили другие, сохраните состояние:
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState == null) {
// app started afresh, don't check orientation
/* do application first-run stuff */
} else {
// re-started, so check for orientation change
boolean orientationChanged = false;
if(savedInstanceState != null) {
int lastOrientation = savedInstanceState.getInt("last_orientation");
orientationChanged = (getOrientation() != lastOrientation);
}
if(orientationChanged) {
// orientation changed
/* do stuff */
} else {
// orientation has not changed
/* do stuff */
}
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putInt("last_orientation", getOrientation());
}
private int getOrientation() {
// ...
}
}
Ответ 6
Вы можете попробовать следующее.
В каждом onStart вы можете сохранить текущую ориентацию (посмотрите здесь).
Если это первый вызов onStart, ничего не делать при других вызовах, проверьте, изменилась ли ориентация и сделайте то, что вам нужно.
private int m_currentOrientation = -1;
public void onStart()
{
int oldOrientation = m_currentOrientation; //
m_currentOrientation = getCurrentOrientation(); // As in the link above
if ((oldOrientation != -1) && (oldOrientation != m_currentOrientation))
{
// Do what you need
}
}
Ответ 7
В этом случае, почему бы вам не заниматься настройками конфигурации (ориентацией) самостоятельно. Сообщите андроиду не обрабатывать ориентацию экрана.
android:configChanges="keyboardHidden|orientation"
Затем вы просто переопределяете метод onConfigurationChanged, чтобы получить возможность пересмотреть представление или что-то еще. Оставьте вещи, которые вы не хотите исполнять.
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//do your jobs
}
Ответ 8
mCurrentOrientation
будет -1, если приложение запускается в первый раз.
static int mCurrentOrientation = -1;
public void onStart()
{
int oldOrientation = mCurrentOrientation;
mCurrentOrientation = getCurrentOrientation();
if ((oldOrientation != -1) && (oldOrientation != mCurrentOrientation)) {
// Do your something here.
}
}
Если я правильно понял ваш вопрос, я думаю, что это должно сработать для вас.