【问题标题】:Activity's onpause method not getting called after showing AlertDialog显示 AlertDialog 后未调用 Activity 的 onpause 方法
【发布时间】:2018-01-16 20:22:43
【问题描述】:

我尝试使用下面的代码来检查 Activity 的回调,据我了解,每当对话框出现在 Activity 之上时,应该调用 Activity 的 OnPause() 方法。当对话框消失时 Activity 的OnResume() 应该触发。

令人惊讶的是,它并没有按照应有的方式进行。我已经在 Android M 6.0.1 上进行了测试

如果我错了,请纠正我,这是我的代码,

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onPause() {
        Log.d("MainActivity", "onPause");
        super.onPause();
    }

    @Override
    protected void onResume() {
        Log.d("MainActivity", "onResume");
        super.onResume();
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    protected void onStop() {
        super.onStop();
    }


    public void onClick(View view) {
        AlertDialog.Builder builder;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            builder = new AlertDialog.Builder(MainActivity.this, android.R.style.Theme_Material_Dialog_Alert);
        } else {
            builder = new AlertDialog.Builder(MainActivity.this);
        }
        builder.setTitle("Delete entry")
                .setMessage("Are you sure you want to delete this entry?")
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        // continue with delete
                    }
                })
                .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        // do nothing
                    }
                })
                .setIcon(android.R.drawable.ic_dialog_alert)
                .show();
    }
}  

【问题讨论】:

  • 你根本没有使用你的AlertDialog!在onCreate 中使用.show()onClick 类。
  • 你不会得到这样的回调,除非并且直到他们是带有对话框主题的活动。

标签: android android-activity android-alertdialog


【解决方案1】:

我已经尝试使用下面的代码来检查 Activity 的回调,截至我的 了解每当对话框出现在 Activity 之上时,Activity 的 OnPause() 方法应该调用。当对话框消失时 Activity 的 OnResume() 应该触发。

没有。 Documentation is bit confusing。当您在活动之上调用对话框时,活动的onPause() 将永远不会调用。换个角度想,对话框总是与调用活动相关联,如果该活动未处于运行状态,该对话框将如何可见?

实际上,onPause() 只会在您调用另一个 Activity 作为对话框(使用对话框主题,或不覆盖全屏的 Activity)时调用。


来自文档

onPause()

  • 一个新的、半透明的活动(例如对话框)打开。只要 Activity 仍然部分可见但不在焦点上,它就会保持暂停状态。

你也可以阅读Android: Under what circumstances would a Dialog appearing cause onPause() to be called?

【讨论】:

    【解决方案2】:

    onPause() 在您的活动不再位于活动堆栈顶部时调用。 Dialog 本身不是一个活动,因此不会替换堆栈顶部的当前活动,因此永远不会调用 onPause()

    但是,如果您将 Dialog 实现为 Activity :(主题设置为对话框的活动)。在这种情况下,将对话框显示为 Activity 会导致新 Activity 位于堆栈顶部,因此调用 onPause()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多