返回活动后如何停止progressDialog?

Posted

技术标签:

【中文标题】返回活动后如何停止progressDialog?【英文标题】:How can I stop the progressDialog after returning to the activity? 【发布时间】:2021-11-02 22:15:28 【问题描述】:

我为冥想应用制作了 ProgressDialog。按下冥想会话对应的 Cardview 后,出现一个 ProgressDialog 3 秒,然后打开另一个活动(m1 活动)。但是有一个大问题。返回 MeditationActivity 后,ProgressDialog 显示并且永不停止。

这是我正在使用的代码:

public class Meditation extends AppCompatActivity  

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    binding = ActivityMeditationBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());

findViewById(R.id.Med_1).setOnClickListener(v -> 
        startActivity(new Intent(getApplicationContext(), m1.class));
        progressDialog = new ProgressDialog(Meditation.this);
        progressDialog.show();
        progressDialog.setContentView(R.layout.loading_screen_first_version);
    );

    @Override
public void onBackPressed() 
    super.onBackPressed();
    progressDialog.dismiss();


部分m1代码:

public class m1 extends AppCompatActivity 

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_m1);

    findViewById(R.id.backm).setOnClickListener(v -> 
        onBackPressed();
        mediaPlayer.stop();
        notificationManager.cancelAll();
    );

【问题讨论】:

如果您使用视图绑定,为什么要通过R.id.<id> 从它们的ID 中引用视图?您必须考虑使用binding.<id> 来引用视图。 【参考方案1】:

据我判断,我认为您希望在用户从 m1 活动返回到冥想活动时隐藏进度对话框。

为此,您可以覆盖onResume() 方法,因为当活动从非活动状态进入前台时会调用该方法。你应该在Meditation活动中添加这个:

@Override
public void onResume()
    super.onResume();
    if(progressDialog != null) progressDialog.dismiss();

@Yunis 的回答不起作用,因为当活动准备进入后台时也会调用 onPause,因此它根本不显示对话框!

顺便说一句,ProgressDialog 已被弃用,您可能需要寻找 alternatives :)

【讨论】:

感谢您的建议,但我得到了与上次相同的错误:void android.app.ProgressDialog.dismiss()' on a null object reference。 我找到了解决办法,我把progressDialog.dismiss();在 onRestart 中,它起作用了。也许这个编辑过的代码也有效。感谢您的帮助! 问题是 onResume() 在活动完全能够处理 UI 之前也被调用,但是只有在单击按钮时才会初始化进度对话框,因此它给出了空指针。检查代码中的空异常解决了它:) @DiligentPD 请阅读this。【参考方案2】:

你在错误的地方关闭了progressDialog。例如,您可以在活动的 onPause() 方法中关闭进度对话框

@Override
    protected void onPause() 
        super.onPause();
        progressDialog.dismiss();
    

【讨论】:

现在 ProgressDialog 甚至没有出现,当我退出冥想活动时,应用程序停止并显示错误:空对象引用上的 'void android.app.ProgressDialog.dismiss()' 您能分享一下您的活动课程的代码吗?

以上是关于返回活动后如何停止progressDialog?的主要内容,如果未能解决你的问题,请参考以下文章

ProgressDialog 未显示在活动中

ProgressDialog:如何防止泄漏窗口

在相机活动期间按返回按钮停止应用程序

在Android中,当我播放音频并转到其他活动时,音频回来后不会停止

使用 ProgressDialog 和 AsyncTask 避免样板?

python 中os.system() 调用命令超时后,如何停止