【问题标题】:Changing background color of a view?更改视图的背景颜色?
【发布时间】:2013-01-07 16:14:43
【问题描述】:

我想创建一个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));
    }

在模拟器中运行App后,MyLayoutrun方法无异常执行,但是背景颜色总是黑色。我做错了什么?

【问题讨论】:

  • 什么时候换颜色?请贴代码
  • 你在 logcat 的System.out.println("Color >> " + color); 行得到了什么?
  • @CsehTamás 我正在尝试在run 方法中更改颜色。
  • @ρяσѕρєя K logcat 重复:
    颜色 >> -16777216
    颜色 >> -1

标签: android view background android-linearlayout


【解决方案1】:

嗨,试试这个吧。

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 中运行您的代码。

【讨论】:

  • 我试过了,但我得到了这个错误:方法 runOnUiThread(new Runnable(){}) 未定义 MyLayout 类型
  • @StudentStudent 也许你可以将我的答案标记为正确,如果这真的有帮助的话
【解决方案2】:

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

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

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

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

【讨论】:

  • 我尝试了 invalidate() 而不是 postInvalidate() 和这个 layoutparams :"LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.FILL_PARENT);"但没有任何改变。
  • 你设置 lp 实例到布局了吗?
  • 感谢您的关注。请查看我的回答。+1 为您的有用知识投票。
【解决方案3】:

你不能在线程中使用异步任务来改变它

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

 protected void onPostExecute(Long result) {
         //HERE YOU CAN CHANGE THE COLOR
      }

【讨论】:

    【解决方案4】:

    在跟进@Hisham Muneer 时,我将我的Activity 实例发送到我的班级并且它可以工作。runOnUiThreadActivity 班级中的一个方法。这是最终代码:

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

    【讨论】:

      猜你喜欢
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2019-10-19
      • 2020-03-02
      • 1970-01-01
      相关资源
      最近更新 更多