有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何让AlertDialog在泛型类而不是活动中工作

我试图在一个简单的java类中使用AlertDialog,它不是一个活动。我没有活动

我正在尝试通过以下方式初始化它:

alertDialog = new AlertDialog.Builder(context).create();

我认为问题是我使用了Context而不是getApplicationContext或CurrentActivity

我正在使用一个扩展AsyncTask的类,但我无法让AlertDialog工作,因为它需要其他东西,而不仅仅是编写上下文

我通过以下代码生成了上下文:

Context context;
ClassConstructor (Context ctx){
    context = ctx;
}

这就是我获得上下文的方式

我正在学习PHP/SQLAndroid教程,并了解了这个问题。我想我错过了一些东西,但我再也追不上了,所以有人能提供一个解决方案吗


共 (2) 个答案

  1. # 1 楼答案

    除非将对话框type指定为WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,否则必须使用活动Context的实例来显示AlertDialog。如果您尝试使用ApplicationContext,您将得到一个android.view.WindowManager$BadTokenException错误

    更多详细信息请参见:https://stackoverflow.com/a/10159345/2387695

  2. # 2 楼答案

    您需要在对话框中调用.show()。显示对话框不需要活动上下文。您确实需要将该对话框标记为系统警报对话框

    public class AlertDialogService extends Service {
      @Override
      public int onStartCommand(Intent intent, int flags, int startId) {
        AlertDialog.Builder b = new AlertDialog.Builder(getApplicationContext()).setTitle("Test Alert").setMessage("This is a test.");
        Dialog d = b.create();
        d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        d.show();
    
        return START_NOT_STICKY;
      }
    
      @Nullable
      @Override
      public IBinder onBind(Intent intent) {
        return null;
      }
    }
    

    请注意,您的应用程序必须具有该权限

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    

    另一种方法是使用以对话框为主题的活动,并使用Context.startActivity()来显示它