1

我想创建一个子类linear layout,它的背景颜色必须改变黑色或白色。我写了这段代码:

public class MyLayout extends LinearLayout implements Runnable {

    int color = 0xFFFFFFFF;

    public MyLayout(Context context) {
        super(context);
        Thread t = new Thread(this);
        t.start();
    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
                if(color == 0xFF000000){
                    color = 0xFFFFFFFF;
                }else{
                    color = 0xFF000000;
                }
                this.setBackgroundColor(color);
                postInvalidate();
                System.out.println("Color >> " + color);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

}

然后我将它设置为我的 Activity 的 ContentView:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyLayout(this));
    }

在模拟器中运行应用程序后,run方法的MyLayout执行没有任何异常,但背景颜色总是黑色。我做错了什么?

4

4 回答 4

2

嗨试试这个它的工作。

public class MyLayout extends LinearLayout implements Runnable {

    int color = 0xFFFFFFFF;

    public MyLayout(Context context) {
        super(context);
        myView = this;
        Thread t = new Thread(this);
        t.start();
    }

    private View myView;

    @Override
    public void run() {

        try {
            while (true) {
                Thread.sleep(1000);

                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        if (color == 0xFF000000) {
                            color = 0xFFFFFFFF;
                        } else {
                            color = 0xFF000000;
                        }
                        myView.setBackgroundColor(color);
                        postInvalidate();
                        System.out.println("Color >> " + color);
                    }
                });
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

每当您想通过其他线程对用户界面进行任何更改时,请在 runOnUiThread 中运行您的代码。

于 2013-01-07T16:30:25.473 回答
1

在您尝试过 postInvalidate() 的地方尝试 invalidate()

其他提示:您正在创建一个新的 LinearLayout,但未指定布局大小。 我建议您在使用 setContentView 之前使用 setLayoutParams():

MyLayout layout = new MyLayout(this);
layout.setLayoutParams(new LayoutParams(...));
this.setContentView(layout);

此时,您正在创建一个大小为 0 的新布局(高度和宽度)

于 2013-01-07T16:26:19.107 回答
0

在跟进@Hisham Muneer 时,我将我的活动实例发送给我的班级并且它有效。runOnUiThread是类中的一个方法Activity。这是最终代码:

public class MyLayout extends LinearLayout implements Runnable {

    int color = 0xFFFFFFFF;
    Activity context;

    public MyLayout(Activity context) {
        super(context);
        this.context = context;
        myView = this;
        Thread t = new Thread(this);
        t.start();
    }

    private View myView;

    @Override
    public void run() {

        try {
            while (true) {
                Thread.sleep(1000);

                context.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        if (color == 0xFF000000) {
                            color = 0xFFFFFFFF;
                        } else {
                            color = 0xFF000000;
                        }
                        myView.setBackgroundColor(color);
                        postInvalidate();
                        System.out.println("Color >> " + color);
                    }
                });
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
于 2013-01-07T18:42:54.460 回答
0

您不能在线程中使用 Asynctask 更改它

https://developer.android.com/reference/android/os/AsyncTask.html

 protected void onPostExecute(Long result) {
         //HERE YOU CAN CHANGE THE COLOR
      }
于 2013-01-07T17:17:47.217 回答