我的活动正在尝试创建一个AlertDialog,它需要一个上下文作为参数。如果我使用:

AlertDialog.Builder builder = new AlertDialog.Builder(this);

然而,我对使用“this”作为上下文持怀疑态度,因为即使在屏幕旋转这样简单的操作中,Activity被破坏和重新创建时,也有可能发生内存泄漏。来自Android开发者博客的相关文章:

There are two easy ways to avoid context-related memory leaks. The most obvious one is to avoid escaping the context outside of its own scope. The example above showed the case of a static reference but inner classes and their implicit reference to the outer class can be equally dangerous. The second solution is to use the Application context. This context will live as long as your application is alive and does not depend on the activities life cycle. If you plan on keeping long-lived objects that need a context, remember the application object. You can obtain it easily by calling Context.getApplicationContext() or Activity.getApplication().

但是对于AlertDialog(), getApplicationContext()或getApplication()都不能作为上下文,因为它会抛出异常:

"无法添加窗口-令牌null不是用于应用程序"

参考文献:1、2、3等。

所以,这真的应该被认为是一个“bug”,因为我们被正式建议使用Activity.getApplication(),但它并没有像宣传的那样发挥作用?

Jim


当前回答

对我有用的是传递活动而不是上下文。

我想为我的对话框创建一个自定义布局,但为了保持我的代码独立,我在一个单独的类中创建了它,否则我将不得不复制并粘贴那块代码到我想使用对话框的每个活动中。

Solution解释了我的情况,但它给出了核心解决方案:

当我使用ViewAdapter时,我初始化了活动适配器(不是上下文ex. ->[kotlin]活动:活动)作为参数-> ex. [kotlin] this@MainActivity 然后我把这个参数传递给Viewholder 然后再次将它传递给将膨胀Dialog的类。

在任何地方使用activity[可选名称]:activity[强制类型],直到它到达你想要膨胀的对话框

它有很多传递,但它比复制和粘贴相同的代码在任何地方更有意义

其他回答

我必须通过在片段中显示的自定义适配器上的构造函数发送上下文,并且getApplicationContext()存在此问题。我用:

this.getActivity(). getwindow (). getcontext()在片段的onCreate回调中。

如果你在活动之外,那么你需要在你的函数中使用“NameOfMyActivity”。this" as Activity Activity,示例:

public static void showDialog(Activity activity) {
        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
        builder.setMessage("Your Message")
        .setPositiveButton("Yes", dialogClickListener)
        .setNegativeButton("No", dialogClickListener).show();
}


//Outside your Activity
showDialog(NameOfMyActivity.this);

如果您正在使用片段并使用AlertDialog / Toast消息,请在context参数中使用getActivity()。

为我工作。

干杯!

如果你正在使用一个片段并使用AlertDialog/Toast消息,那么在context参数中使用getActivity()。

像这样

ProgressDialog pdialog;
pdialog = new ProgressDialog(getActivity());
pdialog.setCancelable(true);
pdialog.setMessage("Loading ....");
pdialog.show();

尝试getParent()在上下文的参数位置,如new AlertDialog.Builder(getParent());希望它能起作用,它对我很有效。