2016-12-05 1 views
2

Ich habe ein Dialogfeld mit der AlertDialog.Builder-Klasse erstellt und builder.setView (int resource) aufgerufen, um ein benutzerdefiniertes Layout für die Texteingabe zu erhalten.Android: EditText-Wert von DialogBox mit benutzerdefinierter Ansicht abrufen

Ich versuche, die Werte aus den EditTexts auf dem Layout abzurufen, wenn der Benutzer OK drückt, aber wenn findViewByID() aufgerufen wird, bekomme ich Null-Referenzen. Es scheint, dass dies anderswo geschieht, wenn man vor dem Aufruf von setContentView() versucht, eine View zu laden. Mit dem Builder habe ich das offensichtlich nicht gemacht, gibt es eine Möglichkeit, die Ansichten wiederzuerlangen, oder sollte ich meine Dialoge anders aufbauen?

Java und Stack-Trace:

// 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) 
+0

EditText URL = (EditText) -Dialog. findViewById (R.id.add_sharing_service_url); Um die Edittext-ID aus dem Diague zu erhalten, müssen Sie die ID so ändern – Nithinlal

+0

Post-Code, wie Sie die benutzerdefinierte Ansicht zum Dialog aufblasen – Nithinlal

+0

Mögliches Duplikat von [AlertDialog.Builder mit benutzerdefiniertem Layout und EditText; kann nicht auf die Ansicht zugreifen] (http://stackoverflow.com/questions/22655599/alertdialog-builder-with-custom-layout-and-edittext-cannot-access-view) – Raghavendra

Antwort

2

Erstellen Sie eine Ansicht, in der aufblasen die XML-Datei, und verwenden Sie diese Ansicht vor findViewById()

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

final EditText edtSelectDate = (EditText) view.findViewById(R.id.edtSelectDate); 
+1

Das hat perfekt funktioniert. Vielen Dank. Wird die Antwort akzeptieren, wenn der Timer dies zulässt. – Mrshll1001

0

Überprüfen dieser Code wie den benutzerdefinierten Dialog mit Text bearbeiten aufzublasen.

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

Hope this Hilfe. Glückliche coding.Vote die Antwort, wenn Sie nützliche

+0

Dies funktionierte, wenn es nur ein EditText-Objekt gab, das ich brauchte Anzeige, aber ich muss jetzt eine XML-Datei mit zwei laden, so dass es nicht funktionierte. Code gepostet war mein Testcode. Sorry das war nicht klar – Mrshll1001

+0

@ Mrshll1001 ok hoffe, du hast die Lösung gefunden. –

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

       }); 
      } 
     }); 
     } 
0

Mit diesem Code Ich denke, es erfüllen Ihre Anforderungen die Sie wollen

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(); 
        } 
       }); 
Verwandte Themen