2012-07-18 43 views
1

我正在做一個安卓遊戲。我使用的是RelativeLayout,它承載一個FrameLayout,它承載一個SurfaceView。不過,我在RelativeLayout上添加了一個textview來顯示玩家剩下的健康點數。我有一種方法可以設置他留在文本視圖中的健康點數的整數值。 int值位於另一個類的SurfaceView中。但textview和更新textview的方法在另一個類中。我想讓其他課程中的方法不斷更新,以便textview始終顯示健康值。我怎樣才能做到這一點?該方法稱爲updateHealthPointsTextView()。請幫助我,非常感謝!我的代碼:循環安卓方法

package com.mysoftwaremobileapps.alien.attack; 

import java.util.ArrayList; 

public class GameScreenActivity extends Activity { 
/** Called when the activity is first created. */ 
List<String> myList = new ArrayList<String>(); 
RadioButton radioEasy, radioMedium, radioHard; 
private ExampleView eView; 
public int ParachuterIndex; 
TextView healthPoints; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    dropParachuters(); 
} 
private void dropParachuters() { 
    // TODO Auto-generated method stub 
} 
    @Override 
    protected void onStart() 
    { 
     FrameLayout fl = new FrameLayout(this); 
     eView = new ExampleView(this); 
     fl.addView(eView); 

     healthPoints = new TextView(this); 
     healthPoints.setText("Health Points: " + eView.getThread().healthPoints); 

     RelativeLayout relativeLayout= new RelativeLayout(this); 
     relativeLayout.addView(fl); 
     relativeLayout.addView(healthPoints); 
     setContentView(relativeLayout); 

     eView.getThread().drawAlien(); 
     eView.getThread().drawAlien(); 
     eView.getThread().drawAlien(); 
     eView.getThread().drawAlien(); 
     eView.getThread().drawAlien(); 
     eView.getThread().drawAlien(); 
     eView.getThread().drawAlien(); 
     eView.getThread().drawAlien(); 
     eView.getThread().drawAlien(); 
     eView.getThread().drawAlien(); 
     eView.getThread().publicFloatX = 750; 

     eView.getThread().gettingAttacked(); 

     updateHealthPointsTextView(); 

     super.onStart(); 

     try { 
      Bundle extras = getIntent().getExtras(); 
      if (extras != null) { 
       String value = extras.getString("KEY"); 
      } 
     } catch (Exception e) { 
      // TODO: handle exception 
     } 

} 

    private void updateHealthPointsTextView() { 
     // TODO Auto-generated method stub 
        //Updating textview with health points value 
      healthPoints.setText(Integer.toString(eView.getThread().healthPoints)); 
     } 
    } 
    @Override 
    public boolean onKeyDown(int KeyCode, KeyEvent Event) { 
     if ((KeyCode == KeyEvent.KEYCODE_MENU)) { 
      //Call performSpecialAttack() 
      Log.d("Parachute Hunter", "calling performSpecialAttack()"); 
      eView.getThread().performSpecialAttack(); 
      return true; 
     } 
     return super.onKeyDown(KeyCode, Event); 
    } 


@Override 
protected void onStop() 
{ 
    try { 
     eView.getThread().setRunning(false); 
     eView = null; 
    } 
    catch (NullPointerException e) {} 

    super.onStop(); 
} 
} 
+0

剛剛通過的TextView的引用在類的構造函數和使用處理程序來更新頻繁 – 2012-07-18 11:29:59

回答

0

如何有這樣的方法:

public void setHealthPoints(int points) { 
     eView.getThread().healthPoints = points; 
     //Updating textview with health points value 
     healthPoints.setText("Health Points: " + Integer.toString(points)); 
    } 
} 

調用它無處不在,它不應該阻止GUI線程

0

只是通過TextView中的構造函數的引用並且使用處理程序來頻繁更新它。

public final class MethodUtil { 
TextView mTextView; 

public MethodUtil(TextView mTextView) { 
//this.mTextView =(TextView)mTextView.findViewById(R.id.textview); 
    this.mTextView=mTextView; 
} 
public void updateHealthPointsTextView(){ 
mTextView.post(new Runnable() { 

    @Override 
    public void run() { 
     mTextView.setText("Health Points: " +  eView.getThread().healthPoints); 

    } 
}); 
} 
} 
+0

你能只需要輸入我的新的輸入?我不明白這一點。我應該怎麼稱呼?如果我只是輸入到我的代碼它什麼也沒有 – user1446632 2012-07-18 14:47:22

+0

我想你是更新從其他線程或類的文本視圖或從其他線程更新UI你需要處理程序,我已經實現,我用構造函數來傳遞視圖以便您還可以更新該類的測試視圖 – 2012-07-19 09:40:39

0

我通過簡單地讓倒數計時器從1秒倒計時,然後重新啓動自己並在完成時更新textview來修復它。它的工作原理

 public void updateHealthPointsTextView() { 
     //The aliens are firing and throwing rocks, make the defender lose health 
     new CountDownTimer(1000, 1000) { 

      public void onTick(long millisUntilFinished) { 
      } 

      public void onFinish() { 
       //Updating textview 
       healthPoints.setText("Health points: " + Integer.toString(eView.getThread().healthPoints)); 
       updateHealthPointsTextView(); 
      } 
      }.start(); 
    }