2

I've got a Dialog Box created using the AlertDialog.Builder class, and calling builder.setView(int resource) to give it a custom layout for text entry.

I'm trying to retrieve the values from the EditTexts on the layout when the user hits OK, but when calling findViewByID() I'm getting null references. Reading around it seems that this occurs elsewhere if one attempts to load a View before calling setContentView(). With the Builder I obviously haven't done this, is there a way to retrieve the views or should I be constructing my dialogs a different way?

Java and stack trace below:

// Set up the on click of the Button
    Button add = (Button) findViewById(R.id.manage_connections_add_button);
    add.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View view) {
            AlertDialog.Builder builder = new AlertDialog.Builder(ManageConnectedServicesActivity.this);
            builder.setTitle("Add Service");

            builder.setView(R.layout.component_sharing_service_dialogue);

           // Set up the buttons on the dialog
            builder.setPositiveButton("Add", new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    // Get the connected service url
                    EditText url = (EditText) findViewById(R.id.add_sharing_service_url); // This is the offending line

                    addConnectedService(url.getText().toString()); // Crashes here
                }
            });

            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    dialogInterface.cancel();
                }
            });

            builder.show();
        }
    });

Stack Trace:

12-05 09:54:40.825 1889-1889/uk.mrshll.matt.accountabilityscrapbook  E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                  Process: uk.mrshll.matt.accountabilityscrapbook, PID: 1889
                                                                                  java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
                                                                                      at uk.mrshll.matt.accountabilityscrapbook.ManageConnectedServicesActivity$1$1.onClick(ManageConnectedServicesActivity.java:63)
                                                                                      at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:157)
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                      at android.os.Looper.loop(Looper.java:135)
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:5343)
                                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                                      at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
Mrshll1001
  • 347
  • 4
  • 18
  • EditText url = (EditText)dialogue. findViewById(R.id.add_sharing_service_url); for getting the edittext id from the diague u have to chage the id getting like this – Nithinlal Dec 05 '16 at 09:57
  • post u code how u r inflate the custom view to dialogue – Nithinlal Dec 05 '16 at 10:00
  • Possible duplicate of [AlertDialog.Builder with custom layout and EditText; cannot access view](http://stackoverflow.com/questions/22655599/alertdialog-builder-with-custom-layout-and-edittext-cannot-access-view) – Raghavendra Dec 05 '16 at 10:02

4 Answers4

3

Create one view in which inflate the xml file, and use that view before findViewById()

final View view = inflater.inflate(R.layout.schedule,null);
builder.setView(view);

final EditText edtSelectDate = (EditText) view.findViewById(R.id.edtSelectDate);
Massimiliano Kraus
  • 3,638
  • 5
  • 27
  • 47
Pankaj Lilan
  • 4,245
  • 1
  • 29
  • 48
0

How to inflate the custom dialog with EditText:

AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
LayoutInflater inflater = this.getLayoutInflater();
final View dialogView = inflater.inflate(R.layout.custom_dialog, null);
dialogBuilder.setView(dialogView);

final EditText edt = (EditText) dialogView.findViewById(R.id.edit1);

dialogBuilder.setTitle("Custom dialog");
dialogBuilder.setMessage("Enter text below");
dialogBuilder.setPositiveButton("Done", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        //do something with edt.getText().toString();
    }
});
dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        //pass
    }
});
AlertDialog b = dialogBuilder.create();
b.show();
Ryan M
  • 18,333
  • 31
  • 67
  • 74
Sagar Gangawane
  • 1,985
  • 1
  • 12
  • 22
  • This worked when there wwas only one EditText object I needed to display, but I need to load an XML file with two now so wasn't working. Code posted was my test code. Sorry that wasn't clear – Mrshll1001 Dec 05 '16 at 10:07
0
 myTv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                final View dialogView = inflater.inflate(R.layout.dialog_forgot_password, null);**
                dialogBuilder.setCancelable(true);
                final EditText mobileEt;
                Button done;

                mobileEt = (EditText) dialogView.findViewById(R.id.mobile_et);
                done = (Button) dialogView.findViewById(R.id.done);
                dialogBuilder.setView(dialogView);
                final AlertDialog alertDialog = dialogBuilder.create();
                alertDialog.show();
                done.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (mobileEt.getText().toString().isEmpty()) {
                            mobileEt.setError(getString(R.string.email_or_mobile));
                        } else {

                            alertDialog.dismiss();

                                                hitdApi(mobileEt.getText().toString());

                                        }
                                );

                                mobileEt .setText("Please fill the value");

                });
            }
        });
        }
Gautam Dev
  • 399
  • 2
  • 4
0

Use this code i think it fullfill your requirements which you want

AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getContext());  

LayoutInflater inflater = getActivity().getLayoutInflater();                    
View dialogView = inflater.inflate(R.layout.new_post_dialog_layout, null);
dialogBuilder.setView(dialogView);

                final EditText editText = (EditText) dialogView.findViewById(R.id.et_question_msg);
                Label create = (Label) dialogView.findViewById(R.id.tv_create);
                Label cancel = (Label) dialogView.findViewById(R.id.tv_cancel);
                final AlertDialog alertDialog = dialogBuilder.create();
                alertDialog.setCancelable(false);
                alertDialog.setCanceledOnTouchOutside(false);
                alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                alertDialog.show();
                create.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        String ques = editText.getText().toString().trim();
                        if (TextUtils.isEmpty(ques)) {
                            Toast.makeText(getContext(), "Enter your question", Toast.LENGTH_SHORT).show();
                            return;
                        } else {
                            //hit your api here
                            writeNewPost(userId, username, ques);
                            alertDialog.dismiss();
                        }
                    }
                });
                cancel.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        alertDialog.dismiss();
                    }
                });
sunil Kumawat
  • 475
  • 3
  • 14