从android中的另一个活动返回时刷新活动内容
Posted
技术标签:
【中文标题】从android中的另一个活动返回时刷新活动内容【英文标题】:Refresh the activity content on returning back from another activity in android 【发布时间】:2013-02-25 00:54:55 【问题描述】:我的应用是一个消息应用,它有一个执行收件箱功能的活动。因此,在我的收件箱中,我将在顶部列出未读消息,在底部列出已读消息。
因此,如果我单击未读消息,它将移动到显示所选特定消息的新活动,并且在我的数据库中我会将其标记为已读。因此,在单击返回时,当它移至上一个活动时,此消息应显示在已读活动中。但是,在我的情况下,它显示的是旧场景,即消息仍然显示在未读中。
我认为活动返回时应该刷新,所以我尝试了一些刷新方法,例如:
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()
未被调用,另一个显示错误。
【问题讨论】:
你能粘贴你的错误吗? 【参考方案1】:您可以将刷新布局代码放在一种方法中
例如
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() 之后调用的,所以你也可以把你的代码放在那里
【讨论】:
谢谢我的 onActivityResult 工作,但仍然 onResume 不工作。我在 onResume 函数中写了一个 toast 来检查它是否被调用。 Toast 没有显示,这意味着它没有被调用。你能帮帮我吗? 您可以使用一种常用方法添加代码并在 onCreate 和 onActivityResult() 方法中使用它,就像我在这里写的那样,如果您有任何疑问,请在此处粘贴您的 onCreate 和 onResume 代码,所以我可以写完整的代码【参考方案2】:您的 onResume()
方法由于其签名而永远不会被调用。
当您打算重写方法时,最好使用@Override
。如果您在代码中使用了@Override
,您会被指出您打算覆盖但没有成功的问题。
从1
的观点来看,我建议您尝试更好地理解 Activity 生命周期,因为从 onResume()
内部以及在 super.onResume()
之后调用 super.onCreate()
是,嗯,完全错误。
您的第一个代码 sn-p 应如下所示:
@Override
protected void onResume()
super.onResume();
// do what you need to do if your activity resumes
但您应该确保您了解何时调用 onResume()
。
关于您的onActivityResult()
实现,它可能不是重新加载“收件箱”活动的最有效方法,但它应该可以工作。代码看起来不错,除了一个方面:在这种方法中,我不会调用super.onActivityResult()
,因为它不是必需的,它不能提供有意义的东西。我从不这样做,而且效果很好。所以也许摆脱这个调用,看看错误是否仍然发生。
如果是,请发布错误。
【讨论】:
【参考方案3】:您的代码 sn-p 1 将在这里创建一个递归场景。阅读Activity Lifecycle了解更多详情。
如果您需要动态刷新数据,请将数据获取并在 UI 代码中显示部分移至您的 onResume 方法。这样每次活动恢复时都会获取数据。
否则,您可以使用LiveData从数据库中观察变化并自动更新UI。
【讨论】:
【参考方案4】:不同的设备处理活动破坏的方式不同。我发现的可靠方法是将状态保存到应用程序数据库并检索应用程序的焦点。
【讨论】:
虽然实际销毁确实取决于可用内存,但生命周期是明确定义的。 OP 在他的代码 sn-p 中犯了一个可怕的错误,值得指出,而他没有提到他有持久性问题。请确保您的回答与问题相关。以上是关于从android中的另一个活动返回时刷新活动内容的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据从一个活动传递到android中的另一个活动片段? [复制]