2015-05-30 2 views
1

Я пытаюсь написать простое приложение, которое выводит Toast при нажатии на кнопку в макете. Я чувствую, что это действительно простое исправление, но не может заставить его работать должным образом.NullPointerException при получении текста кнопки в действии

public class MainActivity extends ActionBarActivity implements View.OnClickListener{ 

private Button btnSpotifyApp, btnScoresApp, btnLibraryApp, btnBuildItBigger, btnXYZReader, btnCapstone; 
private Toast mToast; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Button btnSpotifyapp = (Button)findViewById(R.id.btnSpotifyApp); 
    Button btnScoresApp = (Button)findViewById(R.id.btnScoresApp); 
    Button btnLibraryApp = (Button)findViewById(R.id.btnLibraryApp); 
    Button btnBuildItBigger = (Button)findViewById(R.id.btnBuildItBigger); 
    Button btnXYZReader = (Button)findViewById(R.id.btnXYZReader); 
    Button btnCapstone = (Button)findViewById(R.id.btnCapstone); 

    btnSpotifyapp.setOnClickListener(this); 
    btnScoresApp.setOnClickListener(this); 
    btnLibraryApp.setOnClickListener(this); 
    btnBuildItBigger.setOnClickListener(this); 
    btnXYZReader.setOnClickListener(this); 
    btnCapstone.setOnClickListener(this); 
} 

/** 
* Called when a view has been clicked. 
* 
* @param v The view that was clicked. 
*/ 
@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     //SignIn Button Clicked 
     case R.id.btnSpotifyApp: 
      showToast(btnSpotifyApp.getText().toString()); 
      break; 
     case R.id.btnScoresApp: 
      showToast(btnScoresApp.getText().toString()); 
      break; 
     case R.id.btnLibraryApp: 
      showToast(btnLibraryApp.getText().toString()); 
      break; 
     case R.id.btnBuildItBigger: 
      showToast(btnBuildItBigger.getText().toString()); 
      break; 
     case R.id.btnXYZReader: 
      showToast(btnXYZReader.getText().toString()); 
      break; 
     case R.id.btnCapstone: 
      showToast(btnCapstone.getText().toString()); 
      break; 
    } 
} 

Вот полный лог для него:

Process: com.app, PID: 6964 
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.Button.getText()' on a null object reference 
      at com.app.MainActivity.onClick(MainActivity.java:59) 
      at android.view.View.performClick(View.java:4780) 
      at android.view.View$PerformClick.run(View.java:19866) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5254) 
      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:903) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
+1

в 'onCreate' должно быть' btnSpotifyapp = (Button) findViewById (R.id.btnSpotifyApp); 'not' Button btnSpotifyapp = (Button) findViewById (R.id.btnSpotifyApp); 'и это для каждой кнопки – Blackbelt

ответ

2

Используйте переменные кнопки, которые вы уже определены до вашего метода OnCreate(). Ваш метод OnCreate() должен выглядеть следующим образом

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 

btnSpotifyapp = (Button)findViewById(R.id.btnSpotifyApp); 
btnScoresApp = (Button)findViewById(R.id.btnScoresApp); 
btnLibraryApp = (Button)findViewById(R.id.btnLibraryApp); 
btnBuildItBigger = (Button)findViewById(R.id.btnBuildItBigger); 
btnXYZReader = (Button)findViewById(R.id.btnXYZReader); 
btnCapstone = (Button)findViewById(R.id.btnCapstone); 

btnSpotifyapp.setOnClickListener(this); 
btnScoresApp.setOnClickListener(this); 
btnLibraryApp.setOnClickListener(this); 
btnBuildItBigger.setOnClickListener(this); 
btnXYZReader.setOnClickListener(this); 
btnCapstone.setOnClickListener(this); 
} 
+0

По какой-то причине я думал, что должен добавить еще одну кнопку «Button», но вы правы. Я не использую те, которые я объявил в классе. –

1

заканчивал рамку переменного Баттона внутри метода OnCreate(), вы не инициализации частных полого объекта Button класса, но создавать новые кнопки внутри рамки OnCreate().

Вы должны сделать это:

this.btnSpotifyapp = (Button)findViewById(R.id.btnSpotifyApp); 
2

вы повторно объявить все кнопки в OnCreate, поэтому ваши члены класса не инициализируется, поэтому они нулевые, я предполагаю, что btnSpotifyApp вызвал его первый время,

также - попробовать коррекции орфографии для:

private Button btnSpotifyApp 

в противоположность:

btnSpotifyapp.setOnClickListener(this); 

попробовать это:

public class MainActivity extends ActionBarActivity implements View.OnClickListener{ 

private Button btnSpotifyApp, btnScoresApp, btnLibraryApp, btnBuildItBigger, btnXYZReader, btnCapstone; 
private Toast mToast; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    this.btnSpotifyApp = (Button)findViewById(R.id.btnSpotifyApp); 
    this.btnScoresApp = (Button)findViewById(R.id.btnScoresApp); 
    this.btnLibraryApp = (Button)findViewById(R.id.btnLibraryApp); 
    this.btnBuildItBigger = (Button)findViewById(R.id.btnBuildItBigger); 
    this.btnXYZReader = (Button)findViewById(R.id.btnXYZReader); 
    this.btnCapstone = (Button)findViewById(R.id.btnCapstone); 

    btnSpotifyApp.setOnClickListener(this); 
    btnScoresApp.setOnClickListener(this); 
    btnLibraryApp.setOnClickListener(this); 
    btnBuildItBigger.setOnClickListener(this); 
    btnXYZReader.setOnClickListener(this); 
    btnCapstone.setOnClickListener(this); 
} 

/** 
* Called when a view has been clicked. 
* 
* @param v The view that was clicked. 
*/ 
@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     //SignIn Button Clicked 
     case R.id.btnSpotifyApp: 
      showToast(this.btnSpotifyApp.getText().toString()); 
      break; 
     case R.id.btnScoresApp: 
      showToast(this.btnScoresApp.getText().toString()); 
      break; 
     case R.id.btnLibraryApp: 
      showToast(this.btnLibraryApp.getText().toString()); 
      break; 
     case R.id.btnBuildItBigger: 
      showToast(this.btnBuildItBigger.getText().toString()); 
      break; 
     case R.id.btnXYZReader: 
      showToast(this.btnXYZReader.getText().toString()); 
      break; 
     case R.id.btnCapstone: 
      showToast(this.btnCapstone.getText().toString()); 
      break; 
    } 
} 

также - просто интересно - вы пытаетесь получить текст, который на кнопке? или текст откуда-то еще?

+0

Только текст с кнопки для тоста. Есть ли разница (в данном случае) от предшествующего «этого». в коде? –

+0

в вашем сообщении. Да, поскольку у вас есть члены и локальные переменные с тем же именем, в том, что я написал - нет, поскольку члены являются единственными переменными в классе, я добавил их для ясности :) – TommySM

+0

Спасибо! :) –

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