2013-01-07 207 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也許你可以標記我的答案是正確的,如果真的有幫助 –