Android AlertDialog的自定义布局存在问题
我正在尝试创建一个带有自定义布局的AlertDialog。当我试图从一个内部按钮取消对话框时,问题就出现了,所以我在之前声明它为final。它抛出了一个错误,指出尽管元素ID被正确引用,但自定义layoutelement为null。代码如下:Android AlertDialog的自定义布局存在问题,android,nullpointerexception,android-alertdialog,Android,Nullpointerexception,Android Alertdialog,我正在尝试创建一个带有自定义布局的AlertDialog。当我试图从一个内部按钮取消对话框时,问题就出现了,所以我在之前声明它为final。它抛出了一个错误,指出尽管元素ID被正确引用,但自定义layoutelement为null。代码如下: Context ctx = MyActivity.this; AlertDialog.Builder builder = new AlertDialog.Builder(ctx); LayoutInflater inflater = (LayoutInfl
Context ctx = MyActivity.this;
AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
LayoutInflater inflater = (LayoutInflater) ctx.getSystemService( ctx.LAYOUT_INFLATER_SERVICE );
View dialogView = inflater.inflate(R.layout.mkdialog_layout, null);
builder.setView(dialogView);
final AlertDialog myalertdialog = builder.create();
Button okbtt = (Button)myalertdialog.findViewById(R.id.mkdialog_okbtt);
Button cancelbtt = (Button)myalertdialog.findViewById(R.id.mkdialog_cancelbtt);
TextView title = (TextView)myalertdialog.findViewById(R.id.mkdialog_titletv);
title.setText("Are you sure you want to log out?");
okbtt.setOnClickListener(new View.OnClickListener(){
public void onClick(View id) {
myalertdialog.dismiss();
Intent i = new Intent(getBaseContext(), LoginActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
finish();
}});
cancelbtt.setOnClickListener(new View.OnClickListener(){
public void onClick(View id) {
myalertdialog.dismiss();
}});
myalertdialog.show();
错误:
Process: com.mk.companionapp, PID: 22045 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at com.mk.companionapp.activities.ConfigurationActivity$2.onClick(ConfigurationActivity.java:185)
at android.view.View.performClick(View.java:5204)
at android.view.View$PerformClick.run(View.java:21153)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
提前感谢TextView title=(TextView)myalertdialog.findViewById(R.id.mkdialog\u titletv)代码>
到
TextView title=(TextView)dialogView.findviewbyd(R.id.mkdialog\u titletv)代码>TextView title=(TextView)myalertdialog.findViewById(R.id.mkdialog\u titletv)代码>
到
TextView title=(TextView)dialogView.findviewbyd(R.id.mkdialog\u titletv)代码>使用此更新对话框代码
Context ctx = getApplicationContext();
AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
LayoutInflater inflater = (LayoutInflater) ctx.getSystemService( ctx.LAYOUT_INFLATER_SERVICE );
View dialogView = inflater.inflate(R.layout.mkdialog_layout, null);
builder.setView(dialogView);
final AlertDialog myalertdialog = builder.create();
Button okbtt = (Button)dialogView.findViewById(R.id.mkdialog_okbtt);
Button cancelbtt = (Button)dialogView.findViewById(R.id.mkdialog_cancelbtt);
TextView title = (TextView)dialogView.findViewById(R.id.mkdialog_titletv);
title.setText("Are you sure you want to log out?");
okbtt.setOnClickListener(new View.OnClickListener(){
public void onClick(View id) {
myalertdialog.dismiss();
Intent i = new Intent(getBaseContext(), LoginActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
finish();
}});
cancelbtt.setOnClickListener(new View.OnClickListener(){
public void onClick(View id) {
myalertdialog.dismiss();
}});
myalertdialog.show();
您用错误的视图初始化了视图项。用此更新对话框代码
Context ctx = getApplicationContext();
AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
LayoutInflater inflater = (LayoutInflater) ctx.getSystemService( ctx.LAYOUT_INFLATER_SERVICE );
View dialogView = inflater.inflate(R.layout.mkdialog_layout, null);
builder.setView(dialogView);
final AlertDialog myalertdialog = builder.create();
Button okbtt = (Button)dialogView.findViewById(R.id.mkdialog_okbtt);
Button cancelbtt = (Button)dialogView.findViewById(R.id.mkdialog_cancelbtt);
TextView title = (TextView)dialogView.findViewById(R.id.mkdialog_titletv);
title.setText("Are you sure you want to log out?");
okbtt.setOnClickListener(new View.OnClickListener(){
public void onClick(View id) {
myalertdialog.dismiss();
Intent i = new Intent(getBaseContext(), LoginActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
finish();
}});
cancelbtt.setOnClickListener(new View.OnClickListener(){
public void onClick(View id) {
myalertdialog.dismiss();
}});
myalertdialog.show();
您使用错误的视图初始化了视图项。您应该使用对话框视图,而不是myalertdialog
。因此,要使代码正常工作,必须替换
TextView title = (TextView)myalertdialog.findViewById(R.id.mkdialog_titletv);
有以下几点
TextView title = (TextView) dialogView.findViewById(R.id.mkdialog_titletv);
您应该使用dialogView
而不是myalertdialog
。因此,要使代码正常工作,必须替换
TextView title = (TextView)myalertdialog.findViewById(R.id.mkdialog_titletv);
有以下几点
TextView title = (TextView) dialogView.findViewById(R.id.mkdialog_titletv);
正如其他人所说,使用dialogView查找视图而不是myalertdialog,并且将活动上下文传递给Dialog而不是应用程序上下文。因此,请做以下更改
Context ctx=YourActivity.this强>
TextView title=(TextView)myalertdialog.findViewById(R.id.mkdialog_titletv)
到
TextView title=(TextView)dialogView.findviewbyd(R.id.mkdialog_titletv) 正如其他人所说,使用dialogView查找视图而不是myalertdialog,并且将活动上下文传递给Dialog而不是应用程序上下文。因此,请做以下更改
Context ctx=YourActivity.this强>
TextView title=(TextView)myalertdialog.findViewById(R.id.mkdialog_titletv)
到
TextView title=(TextView)dialogView.findviewbyd(R.id.mkdialog_titletv) 用这个。您必须使用活动来创建AlertDialog。
不要使用ApplicationContext
AlertDialog.Builder builder = new AlertDialog.Builder(this);
用这个。您必须使用活动来创建AlertDialog。
不要使用ApplicationContext
AlertDialog.Builder builder = new AlertDialog.Builder(this);
使用以下方法将在我们单击任何按钮时防止警报关闭,并根据我们的业务逻辑为我们提供关闭选项
下面的示例警报包含文本和编辑文本,以及在自定义对话框中的文本和编辑文本
final AlertDialog.Builder dialog = new AlertDialog.Builder(this);
LayoutInflater inflater = this.getLayoutInflater();
final View dialogView = inflater.inflate(R.layout.custom_dialog, null);
dialog.setView(dialogView);
final EditText edt = (EditText)dialogView.findViewById(R.id.email_forgot);
dialog.setView(dialogView);
dialog.setPositiveButton("Ok",new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
}
});
dialog.setNegativeButton("Cancel",new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
});
AlertDialog forgotAlertDialog = dialog.create();
forgotAlertDialog.show();
forgotAlertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
//your positive action
}
});
要关闭警报,请根据逻辑执行以下操作
if (forgotAlertDialog.isShowing()) {
forgotAlertDialog.dismiss();
}
使用以下方法将在我们单击任何按钮时防止警报关闭,并根据我们的业务逻辑为我们提供关闭选项
下面的示例警报包含文本和编辑文本,以及在自定义对话框中的文本和编辑文本
final AlertDialog.Builder dialog = new AlertDialog.Builder(this);
LayoutInflater inflater = this.getLayoutInflater();
final View dialogView = inflater.inflate(R.layout.custom_dialog, null);
dialog.setView(dialogView);
final EditText edt = (EditText)dialogView.findViewById(R.id.email_forgot);
dialog.setView(dialogView);
dialog.setPositiveButton("Ok",new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
}
});
dialog.setNegativeButton("Cancel",new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
});
AlertDialog forgotAlertDialog = dialog.create();
forgotAlertDialog.show();
forgotAlertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
//your positive action
}
});
要关闭警报,请根据逻辑执行以下操作
if (forgotAlertDialog.isShowing()) {
forgotAlertDialog.dismiss();
}
谢谢,这确实是个问题。谢谢,这确实是个问题。谢谢,这确实是个问题。@Burakito接受它作为答案,如果它解决了你的问题,这确实是个问题。@Burakito接受它作为答案,如果它解决了你的问题,我在解决前一个问题时意识到了这个错误。是的,当我解决前一个问题时,我意识到了这个错误。