如果我使用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实例
给我一个显示对话框的解决方案答案 0 :(得分:23)
这是您必须始终记住的关于上下文的 MOST 重要事项之一。有两种类型的上下文,Activity contexts
和Application 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();