更改视图的背景颜色?

Posted

技术标签:

【中文标题】更改视图的背景颜色?【英文标题】: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 【参考方案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();
        

    


【讨论】:

以上是关于更改视图的背景颜色?的主要内容,如果未能解决你的问题,请参考以下文章

更改模态视图的背景颜色

列表视图滚动更改项目视图的背景颜色(简单适配器)

更改视图的背景颜色似乎很难?

更改父视图控制器背景颜色

如何根据背景颜色自动更改视图的透明颜色

iOS Swift - 如何更改表格视图的背景颜色?