2016-04-12 2 views
1

Я попытался использовать OnClickListener из другого класса, но почему-то это порождает мне ошибку. Может ли кто-нибудь помочь мне решить эту проблему?OnClickListener в отдельном классе не работает

Заранее спасибо.

public class TestClass extends Activity{ 



    View.OnClickListener l = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast.makeText(getApplicationContext(),"Clicked", Toast.LENGTH_LONG).show(); 
     }};} 

Часть MainActivity:

@Override protected void onCreate(Bundle savedInstanceState) { 
      ... 
      btnSpeech = (ImageButton) (findViewById(R.id.microphone)); 


      obj=new TestClass(); 
      btnSpeech.setOnClickListener(obj.l); 

      ... 

Ошибка:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.user.project/com.example.user.project.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageButton.setOnClickListener(android.view.View$OnClickListener)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handler.java:102) 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) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageButton.setOnClickListener(android.view.View$OnClickListener)' on a null object reference at com.example.user.project.MainActivity.onCreate(MainActivity.java:74) at android.app.Activity.performCreate(Activity.java:6237) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  at android.app.ActivityThread.-wrap11(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5417)  at java.lang.reflect.Method.invoke(Native Method) 

+0

Если эта трассировка стека для этого кода, то 'btnSpeech' имеет значение NULL. Кроме того, 'TestClass' и его слушатель не будут работать так, как вы ожидаете. Вы не можете создать экземпляр 'Activity' с' new' и работать корректно. Вместо этого вы можете удалить 'extends Activity' и заменить' getApplicationContext() 'на' v.getContext() '. Хотя, я не понимаю, почему вы просто не создаете слушателя в «MainActivity». –

+0

Спасибо, но это не сработало, это снова дало мне NullPointerException. Я знаю, что вы можете сделать это легко в MainActivity, но я только хотел попробовать, можно ли запустить OnClickListener из отдельного класса, и я следил за множеством предложений из Интернета, но почему-то это не сработало для меня. – AndrIOS

+0

Если текущая трассировка стека такая же, как вы указали выше, тогда 'btnSpeech' по-прежнему является нулевым. Однако вы не указали нам достаточно информации, чтобы определить, почему. –

ответ

1

Вы получаете NullPointerException, потому что ваш btnSpeech является недействительным. findViewById() возвращает null, если вы используете неверный идентификатор для представления, возможно, это проблема. Вы уверены, что ваше исключение не имеет ничего общего с OnClickListener. Если вы внимательно прочтете свой стек, вы увидите, что он указал, что на объект, который был null, был вызван setOnClickListener().

И, как отметил Майк, вы не можете создавать операции с ключевым словом new. Использовать startActivity() с намерением или сделать TestClass не распространяется Activity.

+0

спасибо. но я проверил идентификатор кнопки в XML, это, безусловно, правильный идентификатор. Может быть, это еще что-то вместо findViewById()? – AndrIOS

+0

@Andr Существует много случаев, в которых 'findViewById()' возвращает значение null. Я не могу догадаться, в чем проблема в вашем случае с таким маленьким кодом. Вы называли 'setContentView()' в начале 'onCreate()'? –

1

это то, что вы только что сделали быстро, но если это решит вашу проблему

public class TestClass { 

    public static Context context; 

    public static View.OnClickListener getListener(){ 
     return new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(context, "Clicked", Toast.LENGTH_LONG).show(); 
      } 
     }; 
    } 

}

В деятельности

TestClass.context = this; 
my_button.setOnClickListener(TestClass.getListener()); 

Надежда эта помощь ..

+0

Спасибо, но он дал мне ту же ошибку с NullPointerException :-( – AndrIOS

+0

Если ваш идентификатор от кнопки yor совпадает с макетом, пытается очистить проект, если это студия android, нажмите в меню ** build **, а затем ** Clean Project **, после этого, пожалуйста, скажите мне, является ли та же ошибка, что вы опубликовали, извините за мой плохой английский –

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