2013-05-27 3 views
1

У меня есть GridLayout с несколькими кнопками в нем.Обновление UI без замерзания

Мне нужно изменить цвет каждой кнопки в последовательности, скажем, каждые 3 секунды.

Я имею проблему над здесь ... Посмотрите на мой код:

runnableScan = new Runnable() { 
    @Override 
    public void run() { 
     GridLayout view = Grid; 
     for (int i = 0; i < view.getChildCount(); i++) { 
      Button btn = (Button)view.getChildAt(i); 
      btn.setBackgroundColor(Color.RED); 
      handlerScan.postDelayed(this, 3000);           
     } 
    } 
};  
handlerScan.postDelayed(runnableScan, 3000);  

Ну .. это действительно изменяет цвет всех кнопок на красный, но меняет их все сразу !!!

Я хотел, чтобы он менял цвета в последовательности, по одной кнопке каждые 3 секунды.

Если я разместил там Toast, то Toast будет запускаться каждые три секунды с индексом каждой кнопки.

Что я делаю неправильно? Почему все кнопки сразу меняются на красный?

+0

Вы уверены, что 'Toast' получает бег каждые 3 секунды, а вы не видя это до тех пор, пока предыдущий «Тост» не будет уволен? – codeMagic

+0

Судья из кода, который вы опубликовали, фактически меняет все цвета кнопок сразу. Попробуйте заменить toast на Log.d и снова сравните время с записями logcat. Тост может дать вам иллюзию задержки, потому что второй тост не появится, пока не будет очищен первый тост. – TactMayers

+0

Привет, CodeMagic и TactMayers! Спасибо за ваш отзыв. Фактически Toast работает каждые три секунды, и он отображает текст (индекс) каждой кнопки. Поскольку текст Toast изменяется, я уверен, что его увольняют каждые три секунды, так как он меняет свой текст. Есть идеи? –

ответ

0

run() метод с выполняемым по-прежнему зацикливание над все кнопки, и изменение цвета на все из них в течение одного вызова run().

Эта линия:

handlerScan.postDelayed(this, 3000);           

не добавляет задержку между итерациями цикла for. Он назначает только run(), через 3 секунды. Попробуйте это (с нет для петли).

runnableScan = new Runnable() { 
    @Override 
    public void run() { 

     GridLayout view = Grid; 
     Button btn = (Button)view.getChildAt(buttonIndex++); 
     if (btn != null) { 
      btn.setBackgroundColor(Color.RED); 
      handlerScan.postDelayed(this, 3000); 
     } 
    } 
    }; 
    handlerScan.postDelayed(runnableScan, 3000); 

Вам нужно будет следить за buttonIndex в качестве переменной-члена в классе:

private int buttonIndex; 

, а затем инициализировать его в индекс вашей первой кнопки. Например, если вы установите вид контента в onCreate(), а затем использовать:

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

     GridLayout view = Grid; 
     for (buttonIndex = 0; buttonIndex < view.getChildCount(); buttonIndex++) { 
     View v = view.getChildAt(buttonIndex); 
     if (v instanceof Button) { 
      // we found the first button, so stop looping 
      break; 
     } 
     } 

     handlerScan = new Handler(); 

Путь код, который я показал вам работает, что она изменится на кнопку 1 цвет на красный, а затем через 3 секунды, кнопку изменения 2 к красный, затем через 3 секунды, смените кнопку 3 на красный. Если вы хотите снова запустить процесс, просто сбросьте buttonIndex обратно в индекс первой кнопки, после того, как он закончит смену кнопки 3.

+0

Привет, Нейт ...прежде всего, спасибо за ваш ответ. Это имеет большой смысл. Я только что редактировал свой код, чтобы отразить ваши предложения. Однако даже в этом случае мне кажется, что мой код ждет три секунды, а затем он меняет ВСЕ кнопки на красный. Заметьте, что я вставил это: handlerScan.postDelayed (это, 3000); внутри цикла. Несмотря на это, он сразу меняет все кнопки на красный. Есть идеи? Это сводит меня с ума !!! = P –

+0

Вы не делали то, что я раньше предлагал. Вы все еще перебирали все три кнопки. Я изменил свой ответ, чтобы показать ** точно **, что вы должны использовать. – Nate

+0

Привет, Нейт! Большое спасибо! Это сделал трюк! Кроме того, я узнал немного больше о том, как обработчики работают в Android! Благодаря! –

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