Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 169
Записей в блоге: 1
#1

Как правильно сохранять/восстанавливать данные из Bundle - Программирование Android

02.07.2016, 17:47. Просмотров 649. Ответов 3
Метки нет (Все метки)

Доброго дня.
Не могу точно разобраться где вызывать сохранение данных в Bundle и извлечение их оттуда.

В Активити есть поле ImageView куда я получаю фото с камеры. И при повороте экрана это поле очищается. Если прооверрайдить методы onPause и onResume и добавить в них Log.d то я вижу что при повороте экрана вызываются onPause-onCreate-onResume. Всё как и должно быть.

Но где создавать Bundle и сохранять туда BitMap как массив байтов, в onPause ИЛИ ещё в одном прооверрайдженом методе класса - onSaveInstanceState?
И восстанавливать поле ImageView из Bundle в onCreate, onRestore или аналогично добавить ещё метод onRestoreInstanceState в класс?

Не очень хорошо смог перевести с английского с stackoverflow.com
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2016, 17:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно сохранять/восстанавливать данные из Bundle (Программирование Android):

Как правильно присвоить переменным данные для использования с другом методе? - Программирование Android
Привет всем! Есть такая проблема... есть push уведомления, и когда приходит уведомление их нужно добавить в массив для показа в...

Как правильно обновить данные для списка при изменении данных в другом фрагменте? - Программирование Android
Здравствуйте. Подскажите как правильно обновить данные для адаптера списка в главном фрагменте при изменении списка в дочернем фрагменте....

Сохранение в Bundle данных - Программирование Android
Вот когда идет сохранение состояния активити onSaveInstanceState(Bundle outState). Оно сохраняется в обьект Bundle. А где эти данные хранит...

Adt-bundle-windows - Программирование Android
Здравствуйте, Уважаемые программисты Андроид! Сориентируйте пожалуйста по такому вопросу. Установил adt-bundle-windows с поддержкой С++....

Получить массив из Bundle extras - Программирование Android
Приходит intent. Bundle extras = intent.getExtras(); extras содержит: Bundle как можно получить все данные и записать их...

Переопределение onSaveInstanceState(Bundle) и отображение текста по нажатию - Программирование Android
Наверное сложно будет понять чего я хочу, но вдруг... Через Intent из родительской активности перехожу в дочернюю. Там при нажатии...

3
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
02.07.2016, 17:55 #2
Цитата Сообщение от arvalon Посмотреть сообщение
И восстанавливать поле ImageView из Bundle в onCreate, onRestore или аналогично добавить ещё метод onRestoreInstanceState в класс?
В onCreate или onRestoreInstanceState (но проще в первом). Если onCreate не выполняется, значит, активность не разрушена, данные не потеряны.
Цитата Сообщение от arvalon Посмотреть сообщение
Но где создавать Bundle и сохранять туда BitMap как массив байтов, в onPause ИЛИ ещё в одном прооверрайдженом методе класса - onSaveInstanceState?
Я обычно использую onSaveInstanceState, но он не является частью жизненного цикла, поэтому в некоторых случаях может быть не вызван. Поэтому критически важную информацию лучше сохранять в onPause. Хотя, с другой стороны, там нет Bundle, и вызываться onPause будет чаще, чем onSaveInstanceState.
0
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 169
Записей в блоге: 1
02.07.2016, 23:05  [ТС] #3
Добавил логгирование во все методы, участвующие в жизненном цикле. Да, onSaveInstanceState не вызывается. Но зато вызывается onRestoreInstanceState! Странно, я думал они работают в паре и как-то вмешаны в основной жизненный цикл.

onPause->onCreate->onRestoreInstanceState->onResume

Значит место где можно сохранить данные - onPause. А в нём просто создаётся новый бандл и заполняется парами ключ-значение?

Bundle bundle=new Bundle();
bundle.putByteArray(...,...);

Добавлено через 4 часа 56 минут
Понял почему не вызывался onSaveInstanceState, добавил в класс public метод, а надо было protected. Теперь работает, но только 1 раз Т.е. получаю фото в ImageView, поворачиваю - фото сохраняется. Поворачиваю ещё раз - стирается. Никаких NullPointerException не вылетает.
Не могу понять почему при втором повороте картинка не восстанавливается из outState
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class AddEquipment extends AppCompatActivity {
 
    private static final int TAKE_PHOTO = 1;
    private static final String EQUIPMENT_IMAGE = "EQUIPMENT_IMAGE";
    private Button addPhoto;
    private ImageView equipmentImage;
    private Bitmap bp;
 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        Log.d("happy","onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_addequipment);
 
        addPhoto=(Button)findViewById(R.id.addPhoto);
        addPhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addPhoto();
            }
        });
 
        equipmentImage=(ImageView)findViewById(R.id.equipment_image);
 
    }
 
    private void addPhoto() {
        Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(i, TAKE_PHOTO);
    }
 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == TAKE_PHOTO) {
            if (resultCode == RESULT_OK) {
                if (data != null && data.getData() != null) {
                    Log.d("happy","Photo is getted");
                    bp = (Bitmap) data.getExtras().get("data");
                    equipmentImage.setImageBitmap(bp);
                }
            }
        }
    }
 
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d("happy","ONSAVEINSTANTSTATE");
        outState.putParcelable(EQUIPMENT_IMAGE,bp);
    }
 
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d("happy","ONRESTOREINSTANTSTATE");
        equipmentImage.setImageBitmap((Bitmap)savedInstanceState.getParcelable(EQUIPMENT_IMAGE));
    }
0
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
03.07.2016, 14:49 #4
отключить пересоздание активти при повороте экрана
или сохранять полученный снимок в виде файла и работать с ним
0
03.07.2016, 14:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2016, 14:49
Привет! Вот еще темы с ответами:

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

Как сохранять добавленное в ListView поле? - Программирование Android
День добрый. Подскажите как можно сохранять добавленное поле , что бы в следующий раз при запуске приложения оно было и добавлять к...

Как в отдельном классе сохранять переменные? - Программирование Android
Добрый день! есть класс, в нем сотни переменных, их значения меняются. как сохранять их значения и как вызывать из другого класса...

Как сохранять информацию о пользователе и использовать её в дальнейшем уведомлении? - Программирование Android
Форумчане, позвольте спросить: как сохранять имя и фамилию пользователя и использовать их в уведомлении? Ранее Java не занимался...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru