2016-03-04 2 views
0

Я не могу пройти мимо этой ошибки «Попытка вызвать виртуальный метод при ссылке на нулевой объект».Студия Android «Попытка вызвать виртуальный метод в ссылке на нулевой объект»

Таким образом, мой Button на код ниже открывает CustomDialog с EditText, где пользователь может обновить свой адрес электронной почты.

 btnChangeEmail=(Button)findViewById(R.id.buttonChangeEmail); 
     btnChangeEmail.setOnClickListener(new OnClickListener() { 
      @Override 

      //Change Email Dialog 
      public void onClick (View arg0){ 
       final Dialog dialog = new Dialog(context); 
       dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
       dialog.setContentView(R.layout.email_dialog); 
       //dialog.setCancelable(false); 
       dialog.setCanceledOnTouchOutside(false); 

       Button dialogButton = (Button) dialog.findViewById(R.id.buttonSave); 
       dialogButton.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         EditText txtNewEmail = (EditText)findViewById(R.id.editTextNewEmail); 
         AlertDialog.Builder alert = new AlertDialog.Builder(context); 
         alert.setTitle("Are you sure?"); 
         alert.setMessage("Use " + txtNewEmail.getText().toString() + " as your new address?"); 
         alert.setCancelable(false); 
         alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 

          } 
         }); 
         alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 

           dialog.dismiss(); 
          } 
         }); 
         AlertDialog alertDialog = alert.create(); 
         alertDialog.show(); 
        } 
       }); 

       Button exitButton = (Button) dialog.findViewById(R.id.buttonExit); 
       exitButton.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         dialog.dismiss(); 
        } 
       }); 

       dialog.show(); 
       Window window = dialog.getWindow(); 
       float h = (float) (getResources().getDisplayMetrics().heightPixels * .9); 
       float w = (float) (getResources().getDisplayMetrics().widthPixels); 
       int height = (int) h; 
       int width = (int) w; 
       window.setLayout(width, height); 
      } 
     } 

При нажатии на кнопку сохранить в вышеупомянутом диалоговом окне пользовательского, он открывает предупреждение, которое предлагает пользователю, если он на самом деле хочет, чтобы продолжить и перезаписать его зарегистрированный адрес электронной почты. Я четко создал экземпляр txtNewEmail, но всегда получаю ошибку ссылки на нулевой объект в строке, где указано

alert.setMessage («Использовать» + txtNewEmail.getText(). ToString() + «как ваш новый адрес?»);

Любая помощь приветствуется. Спасибо.

Вот моя полная ошибка LogCat ...

03-05 01:51:57.704 4512-4512/? E/AndroidRuntime: FATAL EXCEPTION: main 
              Process: com.example.twenty, PID: 4512 
              java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference 
               at com.example.twenty.SettingsActivity$4$1.onClick(SettingsActivity.java:193) 
               at android.view.View.performClick(View.java:5198) 
               at android.view.View$PerformClick.run(View.java:21147) 
               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:726) 
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

Пожалуйста, добавьте полную ошибку, которую можно увидеть в LogCat. – RominaV

+0

У вас есть исключение NullPointerException. Обратите внимание, что 'findViewById' вернет значение null, если данный идентификатор не найден в макете, которую вы ищете. –

+0

Возможный дубликат [Попытка вызвать виртуальный метод] (http://stackoverflow.com/questions/21995264/attempt-to- invoke-virtual-method) – Machado

ответ

2

Ваш EditText внутри onClickListener также будет использовать диалог, чтобы найти идентификатор, как этот

EditText txtNewEmail = (EditText)dialog.findViewById(R.id.editTextNewEmail); 
+0

О, черт возьми, спасибо. Это действительно работало для меня. В следующий раз я буду более внимателен к этой проблеме. Еще раз спасибо. –

2

удалить и добавить инициирована txtNewEmail вне Listener

final EditText txtNewEmail = (EditText)findViewById(R.id.editTextNewEmail); 
btnChangeEmail=(Button)findViewById(R.id.buttonChangeEmail); 
+0

Я пробовал это раньше, но он по-прежнему дает ту же ошибку. Спасибо хоть. –

0
EditText txtNewEmail = (EditText)findViewById(R.id.editTextNewEmail); 

этот объект является нулевым (txtNewEmail) называют этот метод (findViewById) натурой отец

изменение

alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 

          dialog.dismiss(); 
         } 
        }); 

с

alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 

          alert.dismiss(); 
         } 
        }); 
+0

Сначала я не мог понять ваши инструкции, но теперь я их получаю. Спасибо. –

+0

Отцом является диалоговое окно –

+0

Отцу сбивает с толку, вы должны использовать 'parent' для этой ссылки. –

Смежные вопросы