Java 每秒更改按钮的背景
我有一个有8个按钮的活动。我希望所有按钮的背景在活动运行的每一秒之间随机变化。为此,我使用以下代码:Java 每秒更改按钮的背景,java,android,button,timer,background,Java,Android,Button,Timer,Background,我有一个有8个按钮的活动。我希望所有按钮的背景在活动运行的每一秒之间随机变化。为此,我使用以下代码: public class CoinFrenzy扩展活动{ 私有int draw1=R.drawable.buttonshape1; 私有int draw2=R.drawable.buttonshape2; 私有int draw3=R.drawable.buttonshape3; 私有int draw4=R.drawable.buttonshape4; 私有int draw5=R.drawabl
public class CoinFrenzy扩展活动{
私有int draw1=R.drawable.buttonshape1;
私有int draw2=R.drawable.buttonshape2;
私有int draw3=R.drawable.buttonshape3;
私有int draw4=R.drawable.buttonshape4;
私有int draw5=R.drawable.buttonshape5;
私有int draw6=R.drawable.buttonshape6;
私有int draw7=R.drawable.buttonshape7;
私有int draw8=R.drawable.buttonshape8;
私有ArrayList选择器=新建ArrayList();
private ArrayList buttonlist=新建ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u coin\u frenzy);
按钮btn1=(按钮)findViewById(R.id.angry_btn);
按钮btn2=(按钮)findViewById(R.id.angry_btn2);
按钮btn3=(按钮)findViewById(R.id.angry\u btn3);
按钮btn4=(按钮)findViewById(R.id.angry_btn4);
按钮btn5=(按钮)findViewById(R.id.angry_btn5);
按钮btn6=(按钮)findViewById(R.id.angry_btn6);
按钮btn7=(按钮)findViewById(R.id.angry\u btn7);
按钮btn8=(按钮)findViewById(R.id.angry\u btn8);
按钮列表添加(btn1);
按钮列表。添加(btn2);
按钮列表添加(btn3);
按钮列表。添加(btn4);
按钮列表。添加(btn5);
按钮列表。添加(btn6);
按钮列表添加(btn7);
按钮列表添加(btn8);
选择器。添加(图纸1);
选择器。添加(draw2);
选择器。添加(图3);
选择器。添加(图纸4);
选择器。添加(图5);
选择器。添加(图纸6);
选择器。添加(图7);
选择器。添加(图8);
h、 postDelayed(myRunnable,1000);
}
公共静态整数和整数(整数最小值,整数最大值){
//注意:通常这应该是一个字段而不是一个方法
//变量,使其不会在每次调用时重新设定种子。
Random rand=新的Random();
//nextInt通常不包括最高值,
//因此,添加1使其具有包容性
int randomNum=rand.nextInt((最大-最小)+1)+min;
返回随机数;
}
私有处理程序h=新处理程序(Looper.getMainLooper());
private Runnable myRunnable=new Runnable(){
公开募捐{
用于(整数x:选择器){
int randomInt=randInt(0,7);
int back=selector.get(randomInt);
Button currbtn=buttonlist.get(randomInt);
当前挫折背景资源(背面);
}
//一秒钟后再跑一次
h、 postDelayed(myRunnable,1000);
}};
首先做以下两件事:
<> LI>你必须从线程中更改按钮代码的背景。这是崩溃的主要原因。
下面,您可以找到两种方法,说明如何在android上的主/UI线程上运行代码:
runOnUiThread(new Runnable() {
public void run() {
// change background color here
}
});
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
public void run() {
// UI code goes here
}
});
private Handler h = new Handler();
到
否则您的代码将在UI线程之外运行您必须将动态索引传递到
int randomInt = randInt(0, 7);
您总是为最小值为0和最大值为7传递相同的值,因此它不会更改任何背景
使用选择器随机ID将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);
}};
这将对您有所帮助。您不需要在runnable中编写整个代码。只需编写代码来更改背景您正在后台执行UI操作thread@r7v那么我应该如何解决这个问题呢?在XML或中创建布局如果您想通过编程在onCreateMethod中创建布局,并运行传递随机颜色的线程,请使用runonUIthread()当改变背景的时候button@r7v我已经有了XML格式的布局,现在我只是访问按钮和更改背景我更新了问题中的代码,但是现在它只是加载活动,然后没有任何更改。尝试将postDelayed从onCreate移动到onResumedI,没有更改。我认为这不是问题所在在之前的代码中,它将等待1秒并崩溃,这意味着它将尝试执行runnable,现在它什么都不做我在问题中更新了我的代码,但是现在它只是加载活动,然后没有任何更改。在runnable中,您总是分配给一个带有索引randomInt的按钮,一个带有sam的可绘制按钮索引randomInt。也就是说,您总是将drawable更改为与开始时相同的值
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);
}};