2013-01-07 175 views
1

我想创建的linear layout一个子类,它的背景颜色必须改变黑色或White.I写了这个代码:更改视图的背景颜色?

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

    } 

} 

然后,我将其设置为我的活动内容查看:

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

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

+0

当您更改颜色?请张贴代码 –

+0

你在'System.out.println(“Color >>”+ color)中获得什么;'logcat中的行? –

+0

@CsehTamás我试图在'run'方法中改变颜色。 –

回答

0

跟进@Hisham Muneer已,我送我的实例活动上我的课,它的工作原理。 runOnUiThreadActivity class.This的方法是finall代码:

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

    } 

} 
1

尝试无效()()

其他提示: 您正在创建一个新的LinearLayout,不指定版面大小。 我建议你使用setLayoutParams()使用的setContentView前:

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

在这一刻,你正在创建一个新的布局0级(高度和宽度)

+0

我试过无效()代替postInvalidate()和这个的LayoutParams:“的LayoutParams LP =新的LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup中。 LayoutParams.FILL_PARENT);”但没有什么改变。 –

+0

您是否将lp实例设置为布局? – noni

+0

感谢您的关注。请参阅我的答案。 –

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

+0

我试过了,但是我得到这个错误:方法runOnUiThread(new Runnable(){})未定义类型MyLayout –

+0

感谢您的关注。 –

+0

@StudentStudent也许你可以标记我的答案是正确的,如果真的有帮助 –