Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 返回按钮并刷新以前的活动_Android - Fatal编程技术网

Android 返回按钮并刷新以前的活动

Android 返回按钮并刷新以前的活动,android,Android,如果我们有两项活动: 文件列表和上次修改时间 文件编辑活动 用户从列表中选择文件并进入文件编辑活动。编辑完成后,用户按后退按钮返回文件列表 列表不会重新加载,因此在刚刚编辑的文件修改时间内显示不正确的值 按下后退按钮后刷新文件列表的正确方法是什么 本例假设未使用任何数据库,仅使用ArrayAdapter。我建议覆盖活动1中的onResume()方法,并在其中包含刷新阵列适配器的代码,这是通过使用[YourListViewAdapter].notifyDataSangeetched()完成的 如果

如果我们有两项活动:

  • 文件列表和上次修改时间
  • 文件编辑活动
  • 用户从列表中选择文件并进入文件编辑活动。编辑完成后,用户按后退按钮返回文件列表

    列表不会重新加载,因此在刚刚编辑的文件修改时间内显示不正确的值

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


    本例假设未使用任何数据库,仅使用ArrayAdapter。

    我建议覆盖活动1中的
    onResume()
    方法,并在其中包含刷新阵列适配器的代码,这是通过使用
    [YourListViewAdapter].notifyDataSangeetched()完成的


    如果刷新列表时遇到问题,请阅读此内容:

    一个选项是使用第一个活动的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();
    
    现在,在第一个Activity类中,为activityResult()方法编写以下代码

    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
    

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

    无论如何,要熟悉。另外,请注意onRestoreInstanceState和onSaveInstanceState方法,这些方法不会出现在pretty生命周期图中

    (另外,值得回顾一下如何处理您正在做的事情,尽管它确实使用了数据库。)

    我认为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()内编写重新启动活动(再次从事件“按下后退按钮”调用)时要执行的操作

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

    主要是:

    @Override
    public void onRestart()
    {
        super.onRestart();
        finish();
        startActivity(getIntent());
    }
    

    最好的方法是使用

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

    我只有收藏夹类别,因此当我单击收藏夹中的项目时,会显示此类信息,如果我不喜欢,则应将此项目从收藏夹中删除:为此,我刷新数据库并将其设置为适配器(用于recyclerview)[我希望您了解我的问题和解决方案]

    如果您想刷新以前的活动,这一解决方案应在以下方面发挥作用:

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

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

     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() {
        Intent intent = new Intent(this,DesiredActivity.class);
        startActivity(intent);
        super.onBackPressed();
    }
    

    在前面的活动中,请使用此代码。这将实现平稳过渡,并在您按“上一步”按钮返回时重新加载活动。

    onRestart()应能更好地工作。onResume()将被调用两次,而onRestart()将仅在按下“上一步”按钮时被调用。这很简单,但我必须说:显然,最好将onCreate()代码移动到一个单独的方法中,然后从onCreate()和onRestart()调用该方法,而不是复制粘贴它。您还可以使用onCreate()仅用于膨胀视图和实例化全局变量,并使用onStart()分配/(重新)设置它们。因此,每当活动开始时,都会调用init()(或您想调用它的任何名称);i、 在onCreate()或onRestart()之后。如果需要重新初始化活动的ViewModel,这非常有用。让它再次从数据库中获取,设置实例变量…我猜这将转到当前活动而不是上一个活动?我有相同的问题,除了我的是一个片段而不是活动。因此,我遵循这里的建议,它的工作:考虑添加一些解释,如果我不想完成当前的活动,并希望以前的活动是什么updated@Waza_Be
    onResume
    没有给我打电话,知道为什么吗?(我也尝试了
    onRestart
    onPause
    ,但都没有被调用)在我的情况下,我已经从片段转到活动。所以,当从活动返回到片段时,正如其他答案提到的onRestart(),它不包含在片段中,所以,这个答案对我很有用。对于一个片段,您可以使用onResume()。这个问题已经有几年了,提供的答案被标记为低质量帖子以供审阅。以下是一些指导原则。还有其他一些答案提供了OP的问题,它们是在一段时间前发布的。在发布答案时,请确保您添加了新的解决方案或更好的解释,尤其是在回答旧问题时。您能否在代码中添加一些说明,并感谢您的发布。
      @Override
    public void onBackPressed() {      
            refreshActivity();
            super.onBackPressed();
        }
    }
    
    @Override
    public void onBackPressed() {
        Intent intent = new Intent(this,DesiredActivity.class);
        startActivity(intent);
        super.onBackPressed();
    }
    
     @Override
    protected void onRestart() {
        super.onRestart();
        finish();
        overridePendingTransition(0, 0);
        startActivity(getIntent());
        overridePendingTransition(0, 0);
    }