Обновление содержимого активности по возвращении из другой активности в Android
Мое приложение является приложением сообщений, и в нем есть действия, выполняющие функции входящих сообщений. Итак, в моем почтовом ящике я буду перечислять непрочитанные сообщения вверху и читать сообщения внизу.
Поэтому, если я нажму на непрочитанное сообщение, оно перейдет к новому действию, которое отображает выбранное конкретное сообщение, и в моей базе данных я отмечу его как прочитанное. Таким образом, при нажатии назад при переходе к предыдущему действию это сообщение должно отображаться среди прочитанных. Но, в моем случае, это показывает старый сценарий, т.е. сообщение все еще отображается среди непрочитанных.
Я думал, что активность должна быть обновлена, когда она возвращается, поэтому я попробовал некоторые методы обновления, такие как:
1.
public void onResume(Bundle s)
{ // After a pause OR at startup
super.onResume();
this.onCreate(s);
}
2.
Intent intent = new Intent(this, msgdisplayActivity.class); //msgdisplayActivity is activity which display the selected message.
//intent.putExtra("someData", "Here is some data");
startActivityForResult(intent, 1);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==RESULT_OK){
Intent refresh = new Intent(this, inboxlist.class); //inboxlist is activity which list the read and unread messages
startActivity(refresh);
this.finish();
}
}
Но оба этого не сделали. onResume()
не вызывается, а другой показывает ошибку.
4 ответа
Вы можете поместить свой код макета обновления в один метод
например
void populatedata()
{
//your code to show data in listview or lables
//if you are using listview, then you can write adapter.notifyDataSetChanged(); to refresh list
}
тогда вы можете использовать
Intent intent = new Intent(this, msgdisplayActivity.class); //msgdisplayActivity is activity which display the selected message.
startActivityForResult(intent, 1);
а также
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==RESULT_OK){
//call populatedatamethod
populatedata();
}
}
тот же метод, который вы можете использовать в методе onCreate.
Можете ли вы предоставить свой код onCreate и onResume? чтобы я мог отредактировать свой ответ согласно вашему коду?
onResume также вызывается сразу после onActivityResult(), поэтому вы также можете поместить туда свой код
Ваш onResume()
метод никогда не вызывается из-за своей подписи.
Это хорошая идея для использования @Override
всякий раз, когда вы намереваетесь переопределить метод. Если бы вы использовали @Override
в вашем коде вы указали бы на проблему, которую вы намереваетесь переопределить, но не добились успеха.
Судя по твоей точке 1
Я бы посоветовал вам лучше понять жизненный цикл Activity, потому что super.onCreate()
изнутри onResume()
а также после super.onResume()
Хм, все не так.
Ваш первый фрагмент кода должен выглядеть следующим образом:
@Override
protected void onResume() {
super.onResume();
// do what you need to do if your activity resumes
}
Но вы должны убедиться, что вы понимаете, когда onResume()
вызывается.
Относительно вашего onActivityResult()
реализация, возможно, не самый эффективный подход для повторной загрузки "входящих" действий, но это должно работать. Код выглядит хорошо, за исключением одного аспекта: в этом методе я бы не стал super.onActivityResult()
потому что это не требуется, и это не может внести что-то значимое. Я никогда не делаю этого, и это прекрасно работает. Так что, может быть, избавьтесь от этого звонка и посмотрите, происходит ли ошибка по-прежнему.
Если да, пожалуйста, опубликуйте ошибку.
Ваш фрагмент кода 1 создаст здесь рекурсивный сценарий. Прочтите о жизненном цикле активности для получения более подробной информации.
Если вам нужно динамически обновлять данные, переместите выборку и отображение данных в части кода пользовательского интерфейса в свой метод onResume . Таким образом, данные извлекаются каждый раз, когда деятельность возобновляется.
В противном случае вы можете использовать LiveData для наблюдения за изменениями в базе данных и автоматического обновления пользовательского интерфейса.
Разные устройства по-разному обрабатывают разрушение активности. верный метод, который я нашел, - это сохранение состояния в базу данных приложения и получение в фокусе приложения.