2013-05-20 3 views
0

Хорошо, поэтому я делаю приложение только для развлечения, на котором случайное число появляется на экране. Если вы нажмете кнопку с тем же номером, что и случайное число, которое вы получите, и если вы нажмете кнопку с неправильным номером, вы потеряете точку. Уловка у вас всего 10 секунд, чтобы набрать достаточно очков. Во всяком случае, у меня две основные проблемы с приложением. Когда вы нажимаете правильную кнопку, ваш счет не увеличивается. Однако, если вы нажмете неправильную кнопку, оценка снизится. Я нахожу это очень странным. Кроме того, у меня возникают проблемы с настройкой содержимого после окончания таймера, чтобы сообщить игроку, выиграл он или нет. Нужно ли делать отдельную операцию для установки нового представления контента или у меня есть другая ошибка?Кнопка Android не работает

Благодарим за помощь!

Вот моя активность Класс:

package ab.game.crazynumbers; 

import java.util.Random; 
import java.util.Timer; 
import java.util.TimerTask; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class Level1Activity extends Activity { 

Random r; 
Timer t; 
int random; 
double time; 
boolean running = false; 
TextView showingnumber; 
TextView score; 
TextView timer; 
Handler handler; 
Button b1; 
Button b2; 
Button b3; 
Button b4; 
Button b5; 
Button b6; 
Button b7; 
Button b8; 
Button b9; 
Button b0; 
int playerscore; 
TextView finalscore; 
TextView finalscore2; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.level_1); 

    playerscore = 0; 

    showingnumber = (TextView) findViewById(R.id.game_number); 
    score = (TextView) findViewById(R.id.game_score); 
    timer = (TextView) findViewById(R.id.game_timer); 
    finalscore = (TextView) findViewById(R.id.finalscore); 
    finalscore2 = (TextView) findViewById(R.id.finalscore2); 

    running = true; 
    time = 10.0; 

    b0 = (Button) findViewById(R.id.b1_0); 
    b1 = (Button) findViewById(R.id.b1_1); 
    b2 = (Button) findViewById(R.id.b1_2); 
    b3 = (Button) findViewById(R.id.b1_3); 
    b4 = (Button) findViewById(R.id.b1_4); 
    b5 = (Button) findViewById(R.id.b1_5); 
    b6 = (Button) findViewById(R.id.b1_6); 
    b7 = (Button) findViewById(R.id.b1_7); 
    b8 = (Button) findViewById(R.id.b1_8); 
    b9 = (Button) findViewById(R.id.b1_9); 

    randomnumber(); 

    b1.setOnTouchListener(new View.OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent e) { 

      if (e.getAction() == android.view.MotionEvent.ACTION_UP) { 

       if (1 == random) { 
        playerscore++; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 

       if (1 != random) { 
        playerscore--; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 
      } 

      return false; 

     } 
    }); 

    b2.setOnTouchListener(new View.OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent e) { 

      if (e.getAction() == android.view.MotionEvent.ACTION_UP) { 

       if (2 == random) { 
        playerscore++; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 

       if (2 != random) { 
        playerscore--; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 
      } 

      return false; 
     } 
    }); 

    b3.setOnTouchListener(new View.OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent e) { 

      if (e.getAction() == android.view.MotionEvent.ACTION_UP) { 

       if (3 == random) { 
        playerscore++; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 

       if (3 != random) { 
        playerscore--; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 
      } 

      return false; 
     } 
    }); 

    b4.setOnTouchListener(new View.OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent e) { 

      if (e.getAction() == android.view.MotionEvent.ACTION_UP) { 

       if (4 == random) { 
        playerscore++; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 

       if (4 != random) { 
        playerscore--; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 
      } 

      return false; 
     } 
    }); 

    b5.setOnTouchListener(new View.OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent e) { 

      if (e.getAction() == android.view.MotionEvent.ACTION_UP) { 

       if (5 == random) { 
        playerscore++; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 

       if (5 != random) { 
        playerscore--; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 
      } 

      return false; 
     } 
    }); 

    b6.setOnTouchListener(new View.OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent e) { 

      if (e.getAction() == android.view.MotionEvent.ACTION_UP) { 

       if (6 == random) { 
        playerscore++; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 

       if (6 != random) { 
        playerscore--; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 
      } 

      return false; 
     } 
    }); 

    b7.setOnTouchListener(new View.OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent e) { 

      if (e.getAction() == android.view.MotionEvent.ACTION_UP) { 

       if (7 == random) { 
        playerscore++; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 

       if (7 != random) { 
        playerscore--; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 
      } 

      return false; 
     } 
    }); 

    b8.setOnTouchListener(new View.OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent e) { 

      if (e.getAction() == android.view.MotionEvent.ACTION_UP) { 

       if (8 == random) { 
        playerscore++; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 

       if (8 != random) { 
        playerscore--; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 
      } 

      return false; 
     } 
    }); 

    b9.setOnTouchListener(new View.OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent e) { 

      if (e.getAction() == android.view.MotionEvent.ACTION_UP) { 

       if (9 == random) { 
        playerscore++; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 

       if (9 != random) { 
        playerscore--; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 
      } 

      return false; 
     } 
    }); 

    b0.setOnTouchListener(new View.OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent e) { 

      if (e.getAction() == android.view.MotionEvent.ACTION_UP) { 

       if (0 == random) { 
        playerscore++; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 

       if (0 != random) { 
        playerscore--; 
        runOnUiThread(new Runnable() { 
         public void run() { 
          score.setText("Your Score Is " + playerscore); 
         } 
        }); 
        randomnumber(); 
       } 
      } 

      return false; 
     } 
    }); 

    startTimer(); 

} 

public void startTimer() { 

    Timer t = new Timer("Game Timer"); 

    handler = new Handler(); 

    t.scheduleAtFixedRate(new TimerTask() { 

     @Override 
     public void run() { 

      if (time > 0) { 

       time -= 0.1; 

       time = Math.round(time * 10.0)/10.0; 

       runOnUiThread(new Runnable() { 
        public void run() { 
         timer.setText("Seconds Remaining: " + time); 
        } 
       }); 

      } 

      if (time <= 0) { 
       this.cancel(); 
       if (playerscore >= 10) { 
        setContentView(R.layout.win); 
        runOnUiThread(new Runnable() { 
         public void run() { 
          finalscore.setText("Your Final Score Is " 
            + playerscore); 
         } 
        }); 
        try { 
         Thread.sleep(1000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
       if (playerscore < 10) { 
        setContentView(R.layout.lose); 
        runOnUiThread(new Runnable() { 
         public void run() { 
          finalscore2.setText("Your Final Score Is " 
            + playerscore); 
         } 
        }); 
        try { 
         Thread.sleep(1000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
       finish(); 
      } 

     } 

    }, 

    // time before start of timer 
      0, 

      // time before it runs again 
      100); 

} 

public void randomnumber() { 

    r = new Random(); 
    random = r.nextInt(10); 

    runOnUiThread(new Runnable() { 
     public void run() { 
      showingnumber.setText(String.valueOf(random)); 
     } 
    }); 

} 

} 

Вот мой XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/game_timer" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:text="Seconds Remaining: 0.0" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

<TextView 
android:id="@+id/game_score" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_alignParentBottom="true" 
android:layout_alignParentLeft="true" 
android:gravity="center" 
android:text="Your Score Is 0" 
android:textAppearance="?android:attr/textAppearanceLarge" /> 

<Button 
    android:id="@+id/b1.4" 
    android:layout_width="80dp" 
    android:layout_height="50dp" 
    android:layout_alignLeft="@+id/b1.1" 
    android:layout_alignTop="@+id/b1.1" 
    android:layout_marginTop="73dp" 
    android:text="4" /> 

<TextView 
    android:id="@+id/game_number" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/game_timer" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="89dp" 
    android:gravity="center" 
    android:text="0" 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

<Button 
    android:id="@+id/b1.1" 
    android:layout_width="80dp" 
    android:layout_height="50dp" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/game_number" 
    android:layout_marginLeft="14dp" 
    android:layout_marginTop="130dp" 
    android:text="1" /> 

<Button 
    android:id="@+id/b1.7" 
    android:layout_width="80dp" 
    android:layout_height="50dp" 
    android:layout_above="@+id/game_score" 
    android:layout_alignLeft="@+id/b1.4" 
    android:layout_marginBottom="15dp" 
    android:text="7" /> 

<Button 
    android:id="@+id/b1.2" 
    android:layout_width="80dp" 
    android:layout_height="50dp" 
    android:layout_alignBaseline="@+id/b1.1" 
    android:layout_alignBottom="@+id/b1.1" 
    android:layout_centerHorizontal="true" 
    android:text="2" /> 

<Button 
    android:id="@+id/b1.5" 
    android:layout_width="80dp" 
    android:layout_height="50dp" 
    android:layout_alignBaseline="@+id/b1.4" 
    android:layout_alignBottom="@+id/b1.4" 
    android:layout_centerHorizontal="true" 
    android:text="5" /> 

<Button 
    android:id="@+id/b1.8" 
    android:layout_width="80dp" 
    android:layout_height="50dp" 
    android:layout_alignBaseline="@+id/b1.7" 
    android:layout_alignBottom="@+id/b1.7" 
    android:layout_centerHorizontal="true" 
    android:text="8" /> 

<Button 
    android:id="@+id/b1.0" 
    android:layout_width="80dp" 
    android:layout_height="50dp" 
    android:layout_above="@+id/b1.2" 
    android:layout_alignLeft="@+id/b1.2" 
    android:layout_marginBottom="18dp" 
    android:text="0" /> 

<Button 
    android:id="@+id/b1.6" 
    android:layout_width="80dp" 
    android:layout_height="50dp" 
    android:layout_alignBaseline="@+id/b1.4" 
    android:layout_alignBottom="@+id/b1.4" 
    android:layout_alignParentRight="true" 
    android:layout_marginRight="20dp" 
    android:text="6" /> 

<Button 
    android:id="@+id/b1.9" 
    android:layout_width="80dp" 
    android:layout_height="50dp" 
    android:layout_alignBaseline="@+id/b1.7" 
    android:layout_alignBottom="@+id/b1.7" 
    android:layout_alignLeft="@+id/b1.6" 
    android:text="9" /> 

<Button 
    android:id="@+id/b1.3" 
    android:layout_width="80dp" 
    android:layout_height="50dp" 
    android:layout_alignBaseline="@+id/b1.1" 
    android:layout_alignBottom="@+id/b1.1" 
    android:layout_alignLeft="@+id/b1.6" 
    android:text="3" /> 

</RelativeLayout> 
+0

Я бы рекомендовал протоколирование значения случайного на время нажатия кнопки. Поэтому просто добавьте Log.w («RANDOM», «значение random =» + random); – nedaRM

ответ

0

Вы неправильно if использования. После правильного выбора кнопки вы генерируете следующее число и ONCE AGAIN, проверяя, random!=that_button_number. Это происходит почти каждый раз, поэтому он уменьшает ваш счет.

 if (random == 3) {randomNumber()}else{} 

не

if(random==3){ 
     randomNumber(); 
    };  
if(random!=3){}; 

Вы не можете позвонить setContentView во время выполнения вашего appliaction. Вы получите RuntimeException. Вы можете:

  • скрыть один макет, показать новый по setVisibility
  • использования Frame layout
  • многих других вещей, такие как операции фрагмента или добавление новых Просмотров
+0

большое вам спасибо! – user2154477

+0

Это неправильно. 'setContentView()' всегда используется во время выполнения. Если вы имеете в виду после того, как вы запустили 'onCreate()', вы все равно можете сделать это таким образом, но это может быть более грязным, чем другие альтернативы – codeMagic

0

я имел видел код, я обнаружил две проблемы в вашем коде. 1.Вы должны извлечь слушателя, очень глупо писать его для каждой кнопки. 2. В Andoid, не позволяют управлять пользовательским интерфейсом в другом потоке, вы должны использовать ручки

Я китайский и мой английский очень плохо

+0

Я не понимаю, что извлекает средство слушателя. Не могли бы вы объяснить это? – user2154477

+0

Пожалуйста, не говорите членам, что они делают глупо, но предлагают ваше мнение о лучшем способе. Во-вторых, OP использует 'runOnUiThread', который, как следует из названия, работает в потоке' UI' – codeMagic

+0

спасибо, что напомнили мне – minjie

0

Вы генерируете случайное число сразу после счет увеличивается, поэтому он увеличивается, а затем возвращается вниз после того, как вы нажмете следующий if

if (1 == random) { 
       playerscore++; 
       runOnUiThread(new Runnable() { 
        public void run() { 
         score.setText("Your Score Is " + playerscore); 
        } 
       }); 
       randomnumber(); // there is a new nunmber 
      } 

      if (1 != random) { // this should be an else 
       playerscore--; 
       runOnUiThread(new Runnable() { 
        public void run() { 
         score.setText("Your Score Is " + playerscore); 
        } 
       }); 
       randomnumber(); 

Я положил комментарии в коде выше, где у вас возникли проблемы

Кроме того, я с настройкой представление содержимого проблемы после того, как таймер иссякнут, чтобы сказать игроку, если он/она выиграла или нет , Нужно ли делать отдельную операцию для установки нового представления контента или у меня есть другая ошибка?

, не зная, какие проблемы у вас есть, трудно сказать. Но это можно сделать.Тем не менее, я предлагаю использовать в AlertDialog для этого или вы можете создать отдельный Activity для этого с theme из Dialog в manifest

Кроме того, вы можете использовать только один слушатель для всех Buttons, так как все они в значительной степени то же самое , либо в XML, установив функцию onClick одинаково для всех из них

<Button 
    android:id="@+id/button1 
    ... 
    android:onClick="functionName"/> 

затем в Java

public void functionName(View v) 
{ 
    // v is the button that was clicked 
} 

или Java, реализуя свой слушатель, здесь OnClick, с

button1.setOnClickListener(this); // do this for each 
public void onClick(View v) 
{ 
    // v is still the button clicked 
} 

Тогда получите текст кнопки, которая была нажата, и сравнить его случайное число

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