【问题标题】:How do I make the AlertDialog box appear outside the app?如何使 AlertDialog 框出现在应用程序之外?
【发布时间】:2015-06-30 10:19:20
【问题描述】:
@Override
public void run() {
    //Create thread that can alter the UI
    AlarmPage.this.runOnUiThread(new Runnable() {
        public void run() {
            cal = Calendar.getInstance();
            //See if current time matches set alarm time
            if((cal.get(Calendar.HOUR_OF_DAY) == alarmTime.getCurrentHour()) 
                    && (cal.get(Calendar.MINUTE) == alarmTime.getCurrentMinute())){
                //If the sound is playing, stop it and rewind
                if(sound.isPlaying()){
                    ShowDialog();
                    alarmTimer.cancel();
                    alarmTask.cancel();
                    alarmTask = new PlaySoundTask();
                    alarmTimer = new Timer();
                    alarmTimer.schedule(alarmTask, sound.getDuration(), sound.getDuration());
                }
                sound.start();
            }       
        }
    });
}

public void ShowDialog() {
    final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

    alertDialog.setTitle("REMINDER!");
    alertDialog.setMessage("Turn off alarm by pressing off");

    alertDialog.setNegativeButton("Off", new DialogInterface.OnClickListener(){
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(getApplicationContext(), "OFF", Toast.LENGTH_SHORT);
        }
    });

    alertDialog.show();
}

我正在制作一个简单的闹钟应用程序来通知用户。我想制作一个警报框,让用户可以选择在警报响起时关闭警报。我能够制作警报框,但它只出现在应用程序中而不是应用程序之外。我了解该应用程序必须在后台运行。如果我需要显示更多代码或更具体,请询问。

【问题讨论】:

标签: java android android-alertdialog android-alarms


【解决方案1】:

添加一行为:

public void ShowDialog() {
    final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

    alertDialog.setTitle("REMINDER!");
    alertDialog.setMessage("Turn off alarm by pressing off");

    alertDialog.setNegativeButton("Off", new DialogInterface.OnClickListener(){
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(getApplicationContext(), "OFF", Toast.LENGTH_SHORT).show();
        }
    });

    alertDialog.show();
    // line you have to add
    alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);
}

立即检查。

【讨论】:

  • 请尽量让提问者知道这段代码应该插入到哪里,并提供一些关于这段代码的作用和原因的评论。
  • 我知道把它放在哪里,问题是 getWindow() 不起作用,“无法解决”。
  • @Ravi Koradiya 我改变了一些东西并且它工作了,问题是它没有在代码之外显示它,有什么想法吗?
  • getWindow 不存在。请解释您的解决方案
【解决方案2】:

如果答案没有解决您的问题,请不要接受,这是误导。

接受的答案不正确,因为它永远不会在您的应用程序之外起作用。

原因:

  1. 它需要一个活动上下文而不是应用程序上下文。

  2. 如果您提供应用程序上下文,您的应用程序将崩溃并出现 IllegalArgumentException - 您需要使用 Theme.AppCompat 或其后代...

如果您需要问题中实际说明的功能,则必须有一个单独的活动,以对话框为主题,如here

或者您可以使用窗口管理器将自定义视图添加到您的窗口并使其成为系统级警报,例如here

【讨论】:

  • 我不明白为什么这不是公认的答案
【解决方案3】:

这样做创建一个没有ContentViewActivity 或与之关联的View,并在onCreate 中调用alertDialog 方法,还记得将Activity 的背景设置为Transparent 使用ColourDrawable

并且该活动看起来像一个对话框或适合您的偏好,您也可以回退到Themes,因此您可以将Activity 设置为Dialog 并将其视为Dialog 也使用@987654333 @

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    相关资源
    最近更新 更多