Android AlertDialog的自定义布局存在问题

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

我正在尝试创建一个带有自定义布局的AlertDialog。当我试图从一个内部按钮取消对话框时,问题就出现了,所以我在之前声明它为final。它抛出了一个错误,指出尽管元素ID被正确引用,但自定义layoutelement为null。代码如下:

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接受它作为答案,如果它解决了你的问题,我在解决前一个问题时意识到了这个错误。是的,当我解决前一个问题时,我意识到了这个错误。