2016-12-05 9 views
2

У меня есть диалоговое окно, созданное с использованием класса AlertDialog.Builder, и вызов builder.setView (int resource), чтобы предоставить ему настраиваемый макет для ввода текста.Android: получить значение EditText из DialogBox с пользовательским представлением

Я пытаюсь получить значения из EditTexts на макете, когда пользователь нажимает OK, но при вызове findViewByID() я получаю нулевые ссылки. Чтение вокруг кажется, что это происходит в другом месте, если вы пытаетесь загрузить представление перед вызовом setContentView(). С Builder я, очевидно, не сделал этого, есть ли способ получить представление или мне нужно строить мои диалоги по-другому?

Java и трассировки стека ниже:

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

трассировки стека:

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). findViewById (R.id.add_sharing_service_url); для получения идентификатора edittext из diague u вам нужно выполнить идентификацию, как это – Nithinlal

+0

отправить u код как развернуть пользовательский вид для диалога – Nithinlal

+0

Возможный дубликат [AlertDialog.Builder с пользовательским макетом и EditText; невозможно получить доступ к просмотру] (http://stackoverflow.com/questions/22655599/alertdialog-builder-with-custom-layout-and-edittext-cannot-access-view) – Raghavendra

ответ

2

Создание одного вида, в котором раздувать файл XML, и использовать эту точку зрения, прежде чем findViewById()

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

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

Это сработало отлично. Благодарю. Будет принимать ответ, если позволяет таймер. – Mrshll1001

0

Проверьте этот код, как надуть пользовательский диалог с редактирования текста.

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

Надеюсь, что эта помощь. Счастливый coding.Vote ответ, если вы нашли полезный

+0

Это сработало, когда был только один объект EditText, который мне нужен отображение, но мне нужно загрузить файл XML с двумя, так что он не работал. Код был моим тестовым кодом. Извините, что было неясно – Mrshll1001

+0

@ Mrshll1001 хорошо надеюсь, что вы нашли решение. –

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

Используйте этот код я думаю, что это FULLFILL ваших требований, вы хотите

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