Добавлено меню настроек, теперь процесс останавливается

1

Я работаю над приложением, и я добавил меню опций. Перед добавлением меню все было нормально, после добавления, однако, он не запускается, процесс просто прекращается. Я попытался удалить меню, и это не сработало, оно все равно останавливается. В logcat говорится, что существует исключение null-указателя, но я не могу понять, почему это происходит.

my numbers_menu xml файл:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@+id/quit" 
   android:title="@string/quit_str" ></item>

<item android:id="@+id/instructions" 
      android:title="@string/instructions_str"></item>

</menu>

методы:

   @Override
    public boolean onCreateOptionsMenu(Menu menu) {
     MenuInflater inflater = getMenuInflater();
     inflater.inflate(R.menu.numbers_menu, menu);
  return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.quit:
            quit();
            return true;
        case R.id.instructions:
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

Вот код, вызывающий исключение нулевого указателя:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    play_game();

    }

public void play_game() {

     //get some numbers
     rolled1 = roll();
     Log.d(TAG, "rolled1 is up");
     rolled2 = roll();
     Log.d(TAG, "rolled2 is up");

        switch(rolled1) {
     case 1:
      rolled_id_1 = 2131034114;
      break;
     case 2:
      rolled_id_1 = 2131034115;
      break;
     case 3:
      rolled_id_1 = 2131034116;
      break;
     case 4:
      rolled_id_1 = 2131034117;
      break;
     case 5:
      rolled_id_1 = 2131034119;
      break;
     case 6:
      rolled_id_1 = 2131034120;
      break;
     }

        Log.d(TAG, "rolled_id_1 is up with the value " + Integer.toString(rolled_id_1));

     switch(rolled2) {
     case 1:
      rolled_id_2 = 2131034114;
      break;
     case 2:
      rolled_id_2 = 2131034115;
      break;
     case 3:
      rolled_id_2 = 2131034116;
      break;
     case 4:
      rolled_id_2 = 2131034117;
      break;
     case 5:
      rolled_id_2 = 2131034119;
      break;
     case 6:
      rolled_id_2 = 2131034120;
      break;
     }

     Log.d(TAG, "rolled_id_2 is up with the value " + Integer.toString(rolled_id_2));

     switch(rolled1 + rolled2) { 
     case 1:
      rolled_sum = 2131034114;
      break;
     case 2:
      rolled_sum = 2131034115;
      break;
     case 3:
      rolled_sum = 2131034116;
      break;
     case 4:
      rolled_sum = 2131034117;
      break;
     case 5:
      rolled_sum = 2131034119;
      break;
     case 6:
      rolled_sum = 2131034120;
      break;
     case 7:
      rolled_sum = 2131034121;  
      break;
     case 8:
      rolled_sum = 2131034122;   
      break;
     case 9:
      rolled_sum = 2131034124; 
      break;
     case 10:
      rolled_sum = 2131034125;  
      break;
     case 11:
      rolled_sum = 2131034126;  
      break;
     case 12:
      rolled_sum = 2131034127;
      break;
     }

     Log.d(TAG, "rolled_id_sum is up with the value " + Integer.toString(rolled_sum));

     if(lose(rolled_id_1, rolled_id_2, rolled_sum)) {
      dieShow(rolled1, rolled2);
      setContentView(R.layout.main);
      play_game();
     }
     else {
          disable_flag = 0;
          needDisable(rolled_id_1, rolled_id_2);
             dieShow(rolled1, rolled2);
         }



        }

public boolean lose(int rolled_id_1, int rolled_id_2, int rolled_sum) {
     //check loss
     Button button_check_loss_1 = (Button)findViewById(rolled_id_1);
     Log.d(TAG, "getting past first button assignment");
     Button button_check_loss_2 = (Button)findViewById(rolled_id_2);
     Log.d(TAG, "getting past second button assignment");
     Button button_check_loss_3 = (Button)findViewById(rolled_sum);
     Log.d(TAG, "getting past third button assignment");

     if((!button_check_loss_1.isClickable() || !button_check_loss_2.isClickable()) && !button_check_loss_3.isClickable()) {
      Toast loseText = Toast.makeText(this, "you lose1", Toast.LENGTH_LONG);
      loseText.show();
      return true;
     }

     if(!button_check_loss_1.isClickable() && !button_check_loss_2.isClickable() && !button_check_loss_3.isClickable()) {
      Toast loseText = Toast.makeText(this, "you lose2", Toast.LENGTH_LONG);
      loseText.show();
      return true;

     }

     if(rolled_id_1 == rolled_id_2) {
      if ((!button_check_loss_1.isClickable() || !button_check_loss_2.isClickable()) && !button_check_loss_3.isClickable()) {
          Toast loseText = Toast.makeText(this, "you lose3", Toast.LENGTH_LONG);
          loseText.show();
          return true;
      }
     }

     return false;

    }

Ошибка возникает при:

if((!button_check_loss_1.isClickable() || !button_check_loss_2.isClickable()) && !button_check_loss_3.isClickable())
Теги:
nullpointerexception

1 ответ

1
Лучший ответ
case 1:
    rolled_id_1 = 2131034114;
    break;

Позвольте мне угадать... 2131034114 - это int Id кнопки, которую вы взяли из /gen/.../R.java - я прав?

Если это так, ДЕЙСТВИТЕЛЬНО НЕ - хороший способ сделать что-то. Содержимое сгенерированного файла R.java не гарантируется постоянным - добавив меню опций, вероятность того, что были изменены идентификаторы всех (или некоторых) кнопок.

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

Button button_check_loss_1 = (Button)findViewById(rolled_id_1);
Log.d(TAG, "getting past first button assignment");
Button button_check_loss_2 = (Button)findViewById(rolled_id_2);
Log.d(TAG, "getting past second button assignment");
Button button_check_loss_3 = (Button)findViewById(rolled_sum);
Log.d(TAG, "getting past third button assignment");

... вероятно, не может найти один (или все) этих идентификаторов кнопок. Вам нужно использовать R.id.button1 (например) при назначении rolled_id_1.

  • 0
    Спасибо вам большое! Я получил эти цифры из распечатки Integer.toString (v.getId ()). Это не было необходимым способом сделать что-то, но я изменил все на R.id. <Button>, и он работает отлично, еще раз спасибо!
  • 0
    @valon: Не беспокойся, рад, что все решено для тебя ... просто держись подальше от автоматически сгенерированных вещей в будущем, и у тебя все будет хорошо. : D

Ещё вопросы

Сообщество Overcoder
Наверх
Меню