2011-02-26 130 views
1

我在一個應用程序中,我試圖佈局(線性佈局)的兩種顏色之間連續翻轉工作之間反覆翻轉,但隨着預期的顏色不發生變化。當我運行的應用程序,它等待,只有顏色最後提到的改變,並且也只有一次,我懷疑佈局不能儘快改變顏色的應用程序試圖改變其顏色,結果該應用程序只能改變顏色一次。從兩種佈局顏色

下面是代碼

flasher.java

package com.tutorial.flasher; 

import android.app.Activity; 
import android.graphics.Color; 
import android.os.Bundle; 
//import android.os.SystemClock; 
import android.widget.LinearLayout; 


public class flasher extends Activity { 
    /** Called when the activity is first created. */ 
    LinearLayout llaLayout; 
    int a,b = 0; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     llaLayout = (LinearLayout)findViewById(R.id.layo); 

     for (int i=0;i<4;i++) 
     { 
      //SystemClock.sleep(2000); 

      //llaLayout.buildDrawingCache() 
      Thread.currentThread(); 
      try 
      { 
      Thread.sleep(2000); 
      } 
      catch (Exception e) 
      { 
       e.notifyAll(); 

      } 
      llaLayout.setBackgroundColor(Color.parseColor("#0000FF")); 

      //SystemClock.sleep(2000); 
      Thread.currentThread(); 
      try 
      { 
      Thread.sleep(2000); 
      } 
      catch (Exception e) 
      { 
       e.notifyAll(); 

      } 
      llaLayout.setBackgroundColor(Color.parseColor("#FF0000")); 

     // SystemClock.sleep(2000); 
     } 
    } 
} 

我只得到了紅色的佈局。

感謝, 希德

回答

0

不能在主線程阻塞。這會立即使您的應用程序無響應。

你可以使用定時器或單獨的線程來做到這一點。你只需要確保在UI線程上執行實際的UI相關的功能(setBackgroundColor)。爲此,您可以使用Activity.runOnUiThread

+0

謝謝,我試圖通過Activity.runOnUiThread運行UI相關函數,但它沒有按預期工作,這次我只得到了第一個提到的顏色(紅色),這裏是代碼片段,我將setBackground方法在下面提到的部分進行佈局。 \t _activity.runOnUiThread(新的Runnable(){ \t公共無效的run(){ \t \t llaLayout.setBackgroundColor(Color.parseColor( 「#FF0000」)); \t \t \t } }); \t 謝謝,希德 – Sid 2011-02-26 16:01:54

1

可以使用Handler實現這一目標。 例如:

private boolean bool = true; 
llaLayout = (LinearLayout)findViewById(R.id.layo); 
final Handler mHandler = new Handler(); 
mHandler.postDelayed(new Runnable(){ 
      @Override 
      public void run() { 
       mHandler.postDelayed(this, 1000); 
       changeColor();    
      } 
      private void changeColor() { 
       if (bool) { 
        llaLayout.setBackgroundColor(Color.RED); 
        bool = false; 
       } else { 
        llaLayout.setBackgroundColor(Color.BLUE); 
        bool = true; 
       }    
      }}, 1000); 

此代碼將遞歸調用相同功能changeColor()其中1000是時間(毫秒)調用它下一次。 希望它有幫助。