每秒更改按钮的背景

时间:2015-06-09 14:42:36

标签: java android button timer background

我有一个活动,里面有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);

        }};
&#13;
&#13;
&#13;

然而,一秒钟后我的应用程序崩溃没有任何logcat错误。

3 个答案:

答案 0 :(得分:0)

首先做这两件事:

  1. 您必须从线程中删除更改按钮代码的背景。这是崩溃的主要原因。 下面你可以找到关于如何在android上的主/ UI线程上运行代码的两种方法:
  2. runOnUIThread Activity的方法

    runOnUiThread(new Runnable() {
        public void run() {
            // change background color here
        }
    });
    
  3. 处理程序

    Handler handler = new Handler(Looper.getMainLooper());
    handler.post(new Runnable() {
     public void run() {
          // UI code goes here
     }
    });
    
  4. 您可能希望在想要更新UI时使用这两种方法中的一种,例如更新视图上的颜色或其他与UI相关的内容。否则,应用程序可能会崩溃,因为Android上的UI类不是线程安全的。

    这会对你有所帮助!!

答案 1 :(得分:0)

替换

private Handler h = new Handler();

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

否则您的代码将在UI线程之外运行

答案 2 :(得分: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);

        }};

这会对你有所帮助。