仅使用Context而不是Activity实例显示对话框

时间:2012-04-15 03:23:56

标签: android dialog

如果我使用Activity实例,但是当我使用Context或Application Context实例时,我可以显示对话框,而对话框没有显示。

AlertDialog.Builder builder = new AlertDialog.Builder(activity);
            builder.setTitle(title);
            builder.setMessage(msg);

            if (null != positiveLabel) {
                builder.setPositiveButton(positiveLabel, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        dialog.cancel();
                        if (null != listener) {
                            listener.onOk();
                        }
                    }
                });
            }

            if (null != negativeLable) {
                builder.setNegativeButton(negativeLable, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        dialog.cancel();
                        if (null != listener) {
                            listener.onCancel();
                        }
                    }
                });
            }

            builder.create().show();

你能不能使用Activity实例

给我一​​个显示对话框的解决方案

4 个答案:

答案 0 :(得分:23)

这是您必须始终记住的关于上下文的 MOST 重要事项之一。有两种类型的上下文,Activity contextsApplication contexts。您将在许多UI相关类中观察到,传递了一个Context。这不是应用程序上下文!在这种情况下,您必须始终传递活动上下文。除了Toast之外,没有其他UI组件可以与Application上下文一起使用。

当您需要某些与应用程序相关的服务或组件(如电话管理器,位置管理器等)时,始终会传递应用程序上下文。

对于UI,您必须始终传递与UI相关的上下文,即活动。

答案 1 :(得分:6)

这个问题也是我最近遇到的问题,你不能创建一个没有和活动实例的对话框。 getApplicationContext()调用也不起作用。我这样做的方法是调用一个方法,从一个活动创建对话框,并传递“this”,即对该活动的引用作为参数。

如果要重用此代码,作为可重用组件或在多个位置创建对话框的机制,请创建基本活动类并在其中使用此方法,并根据需要在子类活动中使用它。

答案 2 :(得分:0)

出于某种原因[至少在android 2.1中] toast可以在应用程序上下文中而不是进度对话框

MyActivity.this是一个特定于活动的上下文,不会崩溃

MyActivity.getApplicationContext()是全局的,会使进度条崩溃,在以后的版本中也会出现问题。

答案 3 :(得分:0)

要使用上下文,必须从创建对话框的活动中传递它。而且只有当您创建自己的对话框而不是使用Java提供的AlertDialog.Builder时,才有可能。这是一个自定义的,我们将使用它来获取应用程序上下文。

public class CustomDialogPopUp extends Dialog implements View.OnClickListener {

public Activity a;
public Context c;
public Dialog d;
//CUSTOMIZE YOUR DIALOG AS YOU LIKE
RecyclerView pointAbsorber;
ImageButton addPoint, attachPoint;
EditText addContent;

//VERY IMPORTANT CONSTRUCTOR THAT WE SHALL USE TO GET THE CONTEXT
public CustomDialogPopUp(@NonNull Context context, Activity a, Context c) {
    super(context);
    this.a = a;
    this.c = c;
}

//INITIALIZING YOUR CUSTOM DIALOG VIEWS AND WHAT NOT. IT NEEDS AN XML FILE BY THE WAY
public void initViewSnActions(){
    pointAbsorber = findViewById(R.id.pointsRV);
    addPoint = findViewById(R.id.addPoint);
    attachPoint = findViewById(R.id.attachPoint);
    addContent = findViewById(R.id.addContent);
    
}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.custom_dialog);
    initViewSnActions();
}

//ON CLICK LISTENER FOR YOUR VIEWS
@Override
public void onClick(View v) {
    
}

}

要传递应用程序上下文,必须在希望它出现的任何类中对其进行初始化,如下所示。请注意活动上下文的传递方式

NotesPopUp notesPopUp = new NotesPopUp(PersistentTest.this, getParent(), getApplicationContext());
notesPopUp.show();