Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每秒更改按钮的背景_Java_Android_Button_Timer_Background - Fatal编程技术网

Java 每秒更改按钮的背景

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

我有一个有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.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活动的方法

    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
     }
    });
    
  • 当你想更新UI时,比如更新视图上的颜色或其他与UI相关的内容,你可能需要使用这两种方法中的一种。否则,应用程序可能会崩溃,因为Android上的UI类不是线程安全的

    这将帮助您!!

    替换您的

    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);
    
            }};