2012-02-09 45 views
0
package com.example.helloandroid; 

import java.util.Timer; 
import java.util.TimerTask; 

import android.app.Activity; 

import android.os.Bundle; 

import android.os.Handler; 

import android.util.Log; 

import android.view.View; 

import android.widget.Button; 


public class HelloandroidActivity extends Activity { 

/** Called when the activity is first created. */ 

Button mybtn0,mybtn1; 

private Handler mhandler= new Handler(); 

Timer timer= new Timer(); 

String s=new String(" "); 

int delay=0; 

int period=5000; 

int var=0; 

@Override 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // Object o=null; 
    // o.toString(); 
    // TextView tv = new TextView(this); 
    // tv.setText("Hello Andriod"); 

    setContentView(R.layout.main); 
    mybtn0= (Button)findViewById(R.id.number_button); 
    //mybtn.requestFocus(); 
    mybtn0.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      // Perform action on click 
      mybtn0.clearFocus(); 
     } 
    }); 
    // mybtn2= (Button)findViewById(R.id.contact_button); 
    //setUpFocus(); 

    try 
    { 

    mybtn1=(Button)findViewById(R.id.contact_button); 
    //mybtn2= (Button)mybtn.focusSearch(View.FOCUS_DOWN); 
    mybtn1.requestFocus(); 
    mybtn0.clearFocus(); 

    } 
    catch(Exception e) 
    { 
      Log.e("focus change","focus failed",e); 
    } 


    timer.scheduleAtFixedRate(new TimerTask(){ 

     public void run() 
     { 

      switch(var) 
      { 

      case 0: mybtn0.clearFocus(); 
        mybtn1.requestFocus(); 
        break; 

      case 1: mybtn1.clearFocus(); 
        mybtn0.requestFocus(); 
       break; 
      default: break; 
      } 

      var= (var+1)%2; 


     } 

    }, delay, period); 

} 

我已經使用上述代碼來完成兩個按鈕之間使用計時器自動更改焦點。但我得到「從錯誤的線程異常」調用。 我認爲這是因爲計時器。請有人更正此代碼,並提供有關如何使用Handler類實現此代碼的示例代碼。自動更改兩個按鈕之間的焦點定期

回答

0

更改計時器.schedule()看起來像這樣

timer.scheduleAtFixedRate(new TimerTask(){ 

    public void run() 
    { 


     mHandler.sendEmptyMessage(var); // <--- I suggest you camelCase your variable names so "mhandler" should be "mHandler", it will make them easier to read at a glance. 
     var= (var+1)%2; 


    } 

}, delay, period); 

那麼這個處理程序實例添加到您的onCreate()方法的一些其中:

mHandler = new Handler() { 
    public void handleMessage(Message msg) { 
      if(msg.what == 0){ 
       mybtn0.clearFocus(); 
       mybtn1.requestFocus(); 
      }else if(msg.what == 1){ 
       mybtn1.clearFocus(); 
       mybtn0.requestFocus(); 
      } 
    } 
} 

你也可以跳過TimerTask的所有在一起,只需使用Handler執行計劃。看看.sendEmptyMessageDelayed() method