Я пытаюсь изменить ориентацию экрана для своего приложения для Android, но безуспешно. Вот мой манифест:

  <activity
        android:name="fr.ups.l3info.l3info_catchgameactivity.CatchGameActivity"
        android:label="@string/app_name" 
        android:screenOrientation="user"
        android:configChanges="orientation|keyboardHidden" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

И я добавляю эту функцию в свой класс активности:

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

Но когда я меняю ориентацию экрана, приложение создается заново, и эта функция никогда не выполняется. Что я сделал не так? Спасибо за вашу помощь.

1
Hunsu 24 Мар 2014 в 23:39
Я думал, что смена ориентации всегда воссоздает действие
 – 
Rob
24 Мар 2014 в 23:40
Откуда вы знаете, что функция никогда не вызывается?
 – 
Bryan Herbst
24 Мар 2014 в 23:41

3 ответа

Лучший ответ

Используйте это в своем манифесте android:configChanges="keyboardHidden|orientation|screenSize|layoutDirection"

3
Jorge Alfaro 24 Мар 2014 в 23:40
Это последнее ресурсное решение, и его следует избегать, насколько это возможно.
 – 
nKn
24 Мар 2014 в 23:42
Это сработало. но все учебники, которые я прочитал, говорят, что нужно просто добавить android:configChanges="orientation|keyboardHidden"
 – 
Hunsu
24 Мар 2014 в 23:44
В документации говорится: «Если ваше приложение нацелено на уровень API 13 или выше (как указано в атрибутах minSdkVersion и targetSdkVersion), вам также следует объявить конфигурацию screenSize, потому что она также меняется, когда устройство переключается между книжной и альбомной ориентациями».
 – 
Jorge Alfaro
24 Мар 2014 в 23:47

Возможно, вы захотите узнать больше о жизненном цикле активности. Дополнительную информацию можно найти здесь (http://developer.android.com/ обучение / основы / жизненный цикл-активности / index.html)

Но более важно ознакомиться со своим состоянием активности .

Вам нужен не onConfigurationChanged(Configuration newConfig), а onSaveInstanceState(Bundle savedInstanceState) метод.

Теперь в вашем методе OnCreate() вам нужно будет проверить, есть ли уже сохраненное состояние, а затем воссоздать эту ситуацию.

По этой ссылке есть очень хорошее объяснение: Сохранение состояния активности Android с помощью сохранения состояния экземпляра

Но в основном вам нужно сделать следующее:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

А затем с учетом этого:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

STATE_SCORE и STATE_LEVEL - некоторые значения public static final String, которые используются для того, чтобы каким-то образом пометить ваш материал, который вы хотите сохранить.

Например, если у вас есть представление EditText, и вы вводите что-то, а затем вращаете экран, это значение будет потеряно. Но в вашем методе onSaveInstanceState() вы должны использовать этот параметр Bundle и поместить значение вашего представления EditText как String.

Сохранив это, теперь вы можете получить это значение в своем методе onCreate() и установить для него значение вашего представления EditText.

Надеюсь это поможет :)

2
Community 23 Май 2017 в 15:06
Да я это уже читал. Проблема, с которой я столкнулся, заключается в том, что я не могу сохранить объект (могу, но трудно реализовать).
 – 
Hunsu
24 Мар 2014 в 23:55
Вам действительно нужно иметь поворот экрана. Если нет, вы можете заблокировать вращение, добавив свойство вращения в свой манифест. Но если вам нужна ротация, есть еще одна хитрость. Дайте мне знать, что вам нужно.
 – 
Nikola Milutinovic
24 Мар 2014 в 23:57
Да, мне нужен поворот экрана
 – 
Hunsu
25 Мар 2014 в 00:00
Если вы используете модель MVC, возможно, решение вашей проблемы — сохранить весь контроллер. Одним из решений этой проблемы является сохранение в файле. Но ваш контроллер должен реализовать Serializable, и все его поля также должны реализовать Serializable. Если в вашем контроллере или любом другом классе, который вы пытаетесь сохранить, есть представление, это невозможно, но также неправильно иметь представление внутри контроллера. Дайте мне знать, если вам нужна помощь в этом. Еще немного вашего кода очень поможет.
 – 
Nikola Milutinovic
25 Мар 2014 в 00:04
Спасибо за помощь. Я не работаю над сложным приложением. Но я вижу, что ты имеешь в виду. Я сохраню объект, а затем прочитаю его снова, когда приложение будет воссоздано.
 – 
Hunsu
25 Мар 2014 в 00:09

Если вы пытаетесь определить «другой макет» для своего приложения при изменении ориентации, просто определите новый макет, дайте ему то же имя , что и другой макет, и поместите его в раздел res/layout-land .

Таким образом, когда ваше приложение воссоздает себя и вызывает setContentView(layout_name) в функции onCreate, оно вызывает подчиненный res/layout-land, а не тот, который находится в res/layout.

0
Hosni 24 Мар 2014 в 23:52