返回按钮和刷新先前的活动


84

如果我们有两个活动:

  1. 文件列表和上次修改时间
  2. 文件编辑活动

用户从列表中选择一个文件,然后转到文件编辑活动。完成编辑后,用户按下后退按钮以返回文件列表。

该列表未重新加载,因此对于刚编辑的文件修改时间,显示的值不正确。

按下后退按钮后导致文件列表刷新的正确方法是什么?

本示例假定不使用数据库,仅使用ArrayAdapter。


1
onRestart()应该可以更好地工作。onResume()将被调用两次,而onRestart()仅在您按下返回按钮时被调用。
莎拉·坂本

Answers:


108

一种选择是使用第一个活动的onResume。

@Override
public void onResume()
    {  // After a pause OR at startup
    super.onResume();
    //Refresh your stuff here
     }

或者您可以为结果启动活动:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

如果要发送回数据,请在secondActivity中:

 Intent returnIntent = new Intent();
 returnIntent.putExtra("result",result);
 setResult(RESULT_OK,returnIntent);     
 finish();

如果您不想返回数据:

Intent returnIntent = new Intent();
setResult(RESULT_CANCELED, returnIntent);        
finish();

现在在您的FirstActivity类中为onActivityResult()方法编写以下代码

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

  if (requestCode == 1) {

     if(resultCode == RESULT_OK){      
         //Update List         
     }
     if (resultCode == RESULT_CANCELED) {    
         //Do nothing?
     }
  }
}//onActivityResult

如果我不想完成当前活动并希望更新以前的活动怎么办
Mansuu...。

@Waza_别叫onResume我,为什么?(我想onRestartonPause过,但没有人不叫
迈赫迪德赫加尼

就我而言,我从Fragment进入了Activity。因此,当从Activity返回到fragment时,正如其他答案所提到的那样,onRestart()未包含在Fragment中,因此,此答案对我有用。对于片段,可以使用onResume()。
Feroz Khan

39

我认为onRestart()对此更好。

@Override
public void onRestart() { 
    super.onRestart();
    //When BACK BUTTON is pressed, the activity on the stack is restarted
    //Do what you want on the refresh procedure here
}

您可以编写onRestart()中的Activity重新启动(从事件“按下后退按钮”再次调用)时要执行的操作。

例如,如果要执行与onCreate()中相同的操作,请将代码粘贴到onRestart()中(例如,使用更新后的值重建UI)。


7
这是微不足道的,但是我不得不说:显然最好将onCreate()代码移到一个单独的方法中,然后再从onCreate()和onRestart()中调用它们,而不是复制粘贴它。
里卡多·范·登·布鲁克

您还可以仅使用onCreate()来填充视图并实例化全局变量,并使用onStart()来分配/重置它们。这样,只要活动开始,就会调用您的init()(或任何您想调用的东西)。即在onCreate()之后或onRestart()之后。
jwehrle

如果您需要重新初始化活动的ViewModel,这将非常有用。让它再次从数据库获取,设置实例变量……
巨大的


8

我建议覆盖onResume()活动编号1中的方法,并在其中包含刷新数组适配器的代码,这是通过使用[yourListViewAdapater].notifyDataSetChanged();

如果您在刷新列表时遇到问题,请阅读以下内容:Android列表视图刷新


2

如果要刷新以前的活动,此解决方案应该可以工作:

在上一个要刷新的活动中:

@Override
public void onRestart()
{
    super.onRestart();
    // do some stuff here
}

1
private Cursor getAllFavorites() {
    return mDb.query(DocsDsctnContract.DocsDsctnEntry.Description_Table_Name,
            null,
            null,
            null,
            null,
            null,
            DocsDsctnContract.DocsDsctnEntry.COLUMN_Timest);
}
@Override
public void onResume()
{  // After a pause OR at startup
    super.onResume();
    mAdapter.swapCursor(getAllFavorites());
    mAdapter.notifyDataSetChanged();

}

public void swapCursor(Cursor newCursor){
    if (mCursor!=null) mCursor.close();
    mCursor = newCursor;
    if (newCursor != null){
        mAdapter.notifyDataSetChanged();
    }
}

我只是具有“收藏夹”类别,因此当我从“收藏夹”中单击该项目时,会出现此类信息,如果我与它不同,则应从“收藏夹”中删除该项目:为此,我刷新数据库并将其设置为adapter(for recyclerview)[我希望您会理解我的问题和解决方案]


考虑添加一些解释
Gahan

1
 @Override
protected void onRestart() {
    super.onRestart();
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
}

在以前的活动中,请使用此代码。当您按下返回按钮返回时,这将进行平稳的过渡并重新加载活动。


您可以在代码中添加一些说明,并感谢您的发布。
内尔斯

0

如果不处理来自编辑活动的回调(使用onActivityResult),那么我宁愿将您提到的逻辑放在onStart(或可能在onRestart)中,因为将其放在onResume中似乎有点过头了,因为更改只发生在onStop。

无论如何,要熟悉活动生命周期。另外,请注意onRestoreInstanceState和onSaveInstanceState方法,它们不会出现在漂亮的生命周期图中。

(此外,值得一提的是“记事本教程”如何处理您正在做的事情,尽管它确实使用了数据库。)


0

最好的解决方法是使用

Intent i = new Intent(this.myActivity, SecondActivity.class); 
startActivityForResult(i, 1);

0

试试这个

 public void refreshActivity() {
    Intent i = new Intent(this, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
    finish();

}

或片段中

  public void refreshActivity() {
    Intent i = new Intent(getActivity(), MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
    finish();

}

并将此方法添加到您的onBackPressed()

  @Override
public void onBackPressed() {      
        refreshActivity();
        super.onBackPressed();
    }
}

而已...


0
@Override
public void onBackPressed() {
    Intent intent = new Intent(this,DesiredActivity.class);
    startActivity(intent);
    super.onBackPressed();
}

这个问题已有几年历史了,提供的答案被标记为低质量帖子。以下是一些有关如何写一个好的答案的准则。还提供了OP的问题的其他答案,这些答案已在一段时间前发布。发布答案时,请确保添加新的解决方案或实质上更好的解释,尤其是在回答较旧的问题时。
help-info.de 19/09/25
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.