#android #xamarin #onsaveinstancestate #onrestoreinstancestate
#Android #xamarin #onsaveinstancestate #onrestoreinstancestate
Вопрос:
Я работаю над приложением будильника, и в моем макете есть режим выбора времени, используемый для установки времени, когда пользователь хочет, чтобы ему о чем-то напоминали. Кажется, у меня проблема с методами, применяемыми при сохранении значений, когда действие отправляется в фоновом режиме. Код в компиляторе чистый, без ошибок, и все же, когда я отлаживаю его на смартфоне, я отправляю приложение в фоновый режим, а затем, когда возобновляю его, текущий час TimePicker не изменяется этими двумя методами…Мы высоко ценим ваше время и вклад
class SecondActivity : AppCompatActivity
{
TimePicker timePicker2;
int x=2;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
//Timepicker definition
timepicker1=this.FindViewById<TimePicker>(Resource.Id.timepicker1);
//Setting the default selected time of the Timepicker via OnCreate
timepicker1.CurrentHour=Java.Lang.Integer.ValueOf(x);
}
//This method supposedly overrides another method called OnSavedInstanceState and allows programmer to save values to it
protected override void OnSaveInstanceState(Bundle savedInstanceState)
{
int y;
y = 2;
//Saving my value to Bundle savedInstanceState
savedInstanceState.PutInt("value",y);
//This super is being called but i dont know what it does
base.OnSaveInstanceState(savedInstanceState);
}
//This method is supposed to remember all the values user saved before the Activity went into OnPause()
//Changed this from public to protected because i figured onsavedInstanceState has its parameters protected so unless its an inheritance, access to its members is forbidden
protected override void OnRestoreInstanceState(Bundle savedInstanceState)
{
base.OnRestoreInstanceState(savedInstanceState);
//Restore the time value from the SavedInstance state
int c = savedInstanceState.GetInt("value");
//Assign the value to The Timepicker
timePicker2.CurrentHour=(Java.Lang.Integer.ValueOf(c));
}
}````
What am i doing wrong? An additional alert dialog code to detect when activity goes into Onpause and OnRestore will greatly be appreciated
Комментарии:
1. Привет, когда вы вернетесь на передний план приложения, вы можете попробовать воссоздать действие, чтобы проверить,
TimePicker
показывает ли оно текущий час.2. Я пробовал, это не сработало
Ответ №1:
Кажется, у меня проблема с методами, применяемыми при сохранении значений, когда действие отправляется в фоновом режиме.
Вы могли бы проверить это действие.Метод onRestoreInstanceState, который нужно знать:
Этот метод вызывается после
OnStart()
того, как действие повторно инициализируется из ранее сохраненного состояния, приведенного здесь вsavedInstanceState
.
Этот метод не будет вызываться при выходе из фонового режима, он будет вызываться только после повторной инициализации. Такой Recreate()
метод вызовет его.
Поэтому здесь при входе в фоновый режим OnSaveInstanceState
метод работает. Однако, OnRestoreInstanceState
не будет вызван.
Теперь, если вы хотите удалить некоторые данные и восстановить вид между фоном и передним планом, вы можете использовать SharedPreferences
in OnResume()
и OnPause()
of Activity .
Например, код следующим образом:
protected override void OnResume()
{
base.OnResume();
ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(this);
int value = prefs.GetInt("value", 0);
timePicker1.CurrentHour = (Java.Lang.Integer.ValueOf(value));
}
protected override void OnPause()
{
base.OnPause();
ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(this);
ISharedPreferencesEditor editor = prefs.Edit();
int y;
y = 2;
editor.PutInt("value", y);
editor.Apply();
}
Тогда эффект покажет: