Сохранить состояние активности при изменении ориентации Android - программирование
Подтвердить что ты не робот

Сохранить состояние активности при изменении ориентации Android

У меня есть приложение aacplayer, и я хочу сохранить состояние своей активности, когда ориентация меняется от портрета к пейзажу. Текстовые объекты не кажутся пустыми, я попытался заморозить текстовое поле, используя это:

android:freezesText="true"

мой манифест:

android:configChanges="orientation"

Я также пробовал это:

@Override
    public void onConfigurationChanged(Configuration newConfig){
        super.onConfigurationChanged(newConfig);
        setContentView(R.layout.main2);

Итак, когда ориентация меняется на пейзаж, я вижу свой макет-land main2.xml, который работает, но мой текст отключается и кажется пустым. Потоковая музыка отлично работает. Я могу слушать его, когда изменения ориентации, но текст внутри текстовых просмотров исчезает каждый раз, когда я меняю ориентацию своего устройства.

Что мне делать, чтобы исправить это, чтобы сохранить состояние?

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
....
....

Большое спасибо.

4b9b3361

Ответ 1

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

Есть две части, которые вам нужно сделать, предполагая, что вам нужен отдельный макет для портретной и альбомной ориентации.

  • Предполагая, что у вас есть два файла макета XML для портретной и альбомной ориентации, поместите файл макета main.xml в следующие папки:

    res/layout/main.xml < - это будет ваш портретный макет
    res/layout-land/main.xml < - это будет ваш ландшафтный дизайн

    Чтобы все, что вам нужно сделать, не нужно касаться файла манифеста, чтобы изменить android:configChanges="orientation" или переопределить onConfigurationChanged(). На самом деле, он рекомендовал вам не трогать это за то, что вы пытаетесь достичь.

  • Теперь, чтобы сохранить текст в текстовом представлении =) Предположим, что ваше текстовое представление называется MyTextView в вашем XML файле макета. Для вашей деятельности потребуется следующее:

    private TextView mTextView;
    private static final String KEY_TEXT_VALUE = "textValue";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       mTextView = (TextView) findViewById(R.id.main);
       if (savedInstanceState != null) {
          CharSequence savedText = savedInstanceState.getCharSequence(KEY_TEXT_VALUE);
          mTextView.setText(savedText);
       }
    }
    
    @Override
    protected void onSaveInstanceState (Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putCharSequence(KEY_TEXT_VALUE, mTextView.getText());
    }
    

В принципе, всякий раз, когда Android уничтожает и воссоздает вашу активность для изменения ориентации, она вызывает onSaveInstanceState() перед уничтожением и вызывает onCreate() после воссоздания. Независимо от того, что вы сохраните в комплекте в onSaveInstanceState, вы можете вернуться из параметра onCreate().

Итак, вы хотите сохранить значение текстового представления в onSaveInstanceState() и прочитать его и заполнить свое текстовое представление в onCreate(). Если действие создается в первый раз (не из-за изменения вращения), файл savedInstanceState будет иметь значение null в onCreate(). Вам также, вероятно, не нужен android:freezesText="true"

Вы также можете попробовать сохранить другие переменные, если вам нужно, поскольку вы потеряете все переменные, которые вы сохранили, когда действие было уничтожено и воссоздано.

Ответ 2

static CharSequence savedText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if(savedText != null) {
        TextView mTextView = (TextView) findViewById(R.id.main);
        mTextView.setText(savedText);
    }
}

// Another function in activity, when you change text
public void actionButton(View view) {
    // Change and save text in textView
    savedText = "Change text";
    mTextView.setText(savedText);
}

Его работа для меня. Но я думаю, что это не очень хороший стиль кода и архитектура для Android.

Ответ 3

Я использую в KOTLIN статический var/val:

class MyFragment : Fragment()
{
     //all my code
     //access to static vars -> MyStaticClass.hello
}

class MyStaticClass 
{
    companion object {
        var hello: String = "Static text"
        var number_static: Int = 0
    }
}