2015-06-09 3 views
0

У меня есть активность с 8 кнопками. Я хочу, чтобы фоны для всех кнопок случайным образом менялись друг с другом каждую секунду, когда работа ведется. Для этого я использую следующий код:Изменение фона кнопки каждую секунду

public class CoinFrenzy extends Activity { 
 

 
    private int draw1 = R.drawable.buttonshape1; 
 
    private int draw2 = R.drawable.buttonshape2; 
 
    private int draw3 = R.drawable.buttonshape3; 
 
    private int draw4 = R.drawable.buttonshape4; 
 
    private int draw5 = R.drawable.buttonshape5; 
 
    private int draw6 = R.drawable.buttonshape6; 
 
    private int draw7 = R.drawable.buttonshape7; 
 
    private int draw8 = R.drawable.buttonshape8; 
 
    private ArrayList<Integer> selector = new ArrayList<>(); 
 
    private ArrayList<Button> buttonlist = new ArrayList<>(); 
 

 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_coin_frenzy); 
 
     Button btn1 = (Button) findViewById(R.id.angry_btn); 
 
     Button btn2 = (Button) findViewById(R.id.angry_btn2); 
 
      Button btn3 = (Button) findViewById(R.id.angry_btn3); 
 
     Button btn4 = (Button) findViewById(R.id.angry_btn4); 
 
     Button btn5 = (Button) findViewById(R.id.angry_btn5); 
 
      Button btn6 = (Button) findViewById(R.id.angry_btn6); 
 
     Button btn7 = (Button) findViewById(R.id.angry_btn7); 
 
     Button btn8 = (Button) findViewById(R.id.angry_btn8); 
 
     buttonlist.add(btn1); 
 
     buttonlist.add(btn2); 
 
     buttonlist.add(btn3); 
 
     buttonlist.add(btn4); 
 
     buttonlist.add(btn5); 
 
     buttonlist.add(btn6); 
 
     buttonlist.add(btn7); 
 
     buttonlist.add(btn8); 
 
     selector.add(draw1); 
 
     selector.add(draw2); 
 
     selector.add(draw3); 
 
     selector.add(draw4); 
 
     selector.add(draw5); 
 
     selector.add(draw6); 
 
     selector.add(draw7); 
 
     selector.add(draw8); 
 
     h.postDelayed(myRunnable, 1000); 
 

 

 
    } 
 

 
    public static int randInt(int min, int max) { 
 

 
     // NOTE: Usually this should be a field rather than a method 
 
     // variable so that it is not re-seeded every call. 
 
     Random rand = new Random(); 
 

 
     // nextInt is normally exclusive of the top value, 
 
     // so add 1 to make it inclusive 
 
     int randomNum = rand.nextInt((max - min) + 1) + min; 
 

 
     return randomNum; 
 
    } 
 

 
    private Handler h = new Handler(Looper.getMainLooper()); 
 

 
    private Runnable myRunnable = new Runnable() { 
 
     public void run() { 
 
      for (Integer x : selector) { 
 
       int randomInt = randInt(0, 7); 
 
       int back = selector.get(randomInt); 
 
       Button currbtn = buttonlist.get(randomInt); 
 
       currbtn.setBackgroundResource(back); 
 

 
      } 
 

 
      //run again in one second 
 
       h.postDelayed(myRunnable, 1000); 
 

 
     }};

Однако, после того, как одна вторая проходит мое приложение вылетает без ошибок LogCat.

+0

вам не нужно писать весь код в runnable..just писать код, чтобы изменить фон – Meenal

+0

вы делаете материал UI на фоне потока – 3xplore

+0

@ r7v Итак, как я должен это решить? – Alk

ответ

0

Во-первых делать эти 2 вещи:

  1. Вы должны удалить изменения фона кода кнопки из потока. Это основная причина крушения. Ниже вы можете найти два способа о том, как можно один запустить код на главном потоке/UI на Android: метод
  2. runOnUIThread Activity в

    runOnUiThread(new Runnable() { 
        public void run() { 
         // change background color here 
        } 
    }); 
    
  3. Handler

    Handler handler = new Handler(Looper.getMainLooper()); 
    handler.post(new Runnable() { 
    public void run() { 
         // UI code goes here 
    } 
    }); 
    

вы может захотеть использовать один из двух методов всякий раз, когда вы хотите обновить интерфейс, например, обновлять цвета на представлениях или других связанных с UI. В противном случае приложение может потерпеть крах, потому что классы пользовательского интерфейса на Android не являются потокобезопасными.

Это поможет вам!

+0

Я обновил свой код в вопросе, однако теперь он просто загружает активность, а затем ничего не меняется. – Alk

+0

В вашей runnable вы всегда назначаете кнопку с индексом randomInt, которую можно вывести с тем же индексом randomInt. То естьвы всегда меняете свой доход на то же, что и в начале – AterLux

0

Замените ваш

private Handler h = new Handler(); 

в

private Handler h = new Handler(Looper.getMainLooper()); 

в противном случае ваш код будет работать за пределами потока пользовательского интерфейса

+0

Я обновил свой код в вопросе, однако теперь он просто загружает активность, а затем ничего не меняется. – Alk

+0

Попытаться переместить постДайлид из onCreate into onResumed – AterLux

+0

Я сделал, без изменений. Я не думаю, что это проблема, как и раньше, с предыдущим кодом, который будет ждать 1 секунду и сбой, что означает, что он попытается выполнить runnable, теперь он просто ничего не делает – Alk

0

Вы должны пройти динамический индекс в

int randomInt = randInt(0, 7); 

вывсегда передают одинаковые значения для min равно 0 и max равно 7, поэтому он не меняет фона.

Использование переключателей случайных ids заменяет 7 динамическим значением цикла x.

private Runnable myRunnable = new Runnable() { 
     public void run() { 
      for (Integer x : selector) { 
       int randomInt = randInt(0, x); 
       int back = selector.get(randomInt); 
       Button currbtn = buttonlist.get(randomInt); 
       currbtn.setBackgroundResource(back); 

      } 

      //run again in one second 
       h.postDelayed(myRunnable, 1000); 

     }}; 

Было бы полезно для вас.