Search code examples
androidnullpointerexceptiondialogview

Android: Retrieve EditText value from DialogBox with Custom View


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)

Solution

  • 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);