Problems with executing a runnable which updates UI every second

65 views Asked by At

I'm trying to update the background of my buttons every second that the activity is running. Everything seems to work fine with the runnable, as the Logcat outputs the integers every second in these two lines : Log.d("randomint", Integer.toString(randomInt)); and Log.d("back", Integer.toString(back)); however I don't see any visual changes on the screen as the background of all the buttons remains the same.

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 Handler h = new Handler(Looper.getMainLooper());
    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);

        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 Runnable myRunnable = new Runnable() {
        public void run() {
            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);
            for (Integer x : selector) {
                int randomInt = randInt(0, 7);
                Log.d("randomint", Integer.toString(randomInt));
                int back = selector.get(randomInt);
                Log.d("back", Integer.toString(back));
                Button currbtn = buttonlist.get(randomInt);
                currbtn.setBackgroundResource(back);

            }
            h.postDelayed(myRunnable, 1000);

            //run again in one second
        }

    };


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_coin_frenzy, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


}
1

There are 1 answers

0
Submersed On BEST ANSWER

I think it's because of how you're using your random to both get the index of the image you want, and the button you want -- causing them to map to the same items each time. You should just iterate through your buttons list, generate a random index for the background, then set it on the current iterated button.