2012-04-13 84 views
0

我試圖設置一個戰鬥系統,允許用戶選擇近戰攻擊和遠程攻擊(挑選兩個單選按鈕之一)。基於變量按鈕可以說的「超出範圍」,「攻擊近戰」,「攻擊範圍」,「重新加載範圍」。 onresume radioButtons有正確的文字。第一次射擊遠程武器(與遠程武器已經重新加載的戰鬥開始)rangeRadio的文本更改爲「重新加載範圍」,但不會從「重新加載範圍」更改爲「攻擊範圍」,即使武器「重新加載」時也是如此當我結束轉彎時(和瓶坯設定動作)將會造成交易傷害。如果武器需要2回合重新加載。我花了2輪重新加載,單擊主頁按鈕,然後返回到活動它會正確設置文本,並說「範圍攻擊」,其他明智它將保持「重新加載範圍」。 (rangeId == 50表示沒有武器),然後檢查武器是否被加載(int rangeReload = 100),然後最後檢查是否存在射程/射程。如果陳述只完全運行onresume()

private void setActions(){ 
     RadioButton meleeRadio = (RadioButton) findViewById(R.id.meleeRadio); 
     RadioButton rangeRadio = (RadioButton) findViewById(R.id.rangeRadio); 
      if (meleeRange >= distance){meleeRadio.setText(meleeString);}else{meleeRadio.setText(oorString);} 
      if (rangeId == 50){rangeRadio.setText(norangeString);}else{if(rangeReload<=99){rangeRadio.setText(reloadString);}else{ 
      if (rangeRange >= distance){rangeRadio.setText(rangeString); Log.e(rangeString, "Range Attack called");}else{rangeRadio.setText(oorString);}}} 
    } 

我打電話給setActions();在兩個地方。在經由戰鬥前()的onResume - > layoutcombat()

@Override 
protected void onResume() {  
    new pullCombatActions().execute(); 
    new prepCombat().execute(); 
    super.onResume();} 


    private class prepCombat extends AsyncTask<String, Void, String>{ 

     @Override 
     protected String doInBackground(String... params) { 
      playerBattlePrep(); 
      findNPC(); 
      return null;} 
     @Override 
     protected void onPostExecute(String result) { 
      new layoutCombat().execute(); 
     } 
    } 

    private class layoutCombat extends AsyncTask<String, Void, String>{ 

     @Override 
     protected String doInBackground(String... params) { 
      startCombat(); 
      pullCombatText(); 
      return null;} 
     @Override 
     protected void onPostExecute(String result) { 
      setActions(); 
      popStats(); 
      refreshStats(); 
      combatStartText();} 
    } 

第二名我請setActions();在我的AsyncTask中,我在戰鬥結束時運行以刷新屏幕並向用戶顯示通過滾動發生的事情。

private class replaceScreen extends AsyncTask<String, Void, String>{ 

    @Override 
    protected String doInBackground(String... params) { 
     pullCombatStory(); 
     return null; 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     refreshStats(); 
     refreshCombatStory(); 
     highLightPlayerActions(); 
     highLightNpcActions(); 
     setActions(); 
     } 
    } 

我不明白爲什麼它似乎通過對半途而廢我的if語句設置rangeRadio不過的onResume讓它完成所有的方式,顯示rangeRadio正確的文本時。

回答

0

只是一個建議,嘗試移動

 RadioButton meleeRadio = (RadioButton) findViewById(R.id.meleeRadio); 
    RadioButton rangeRadio = (RadioButton) findViewById(R.id.rangeRadio); 

外面您的onResume方法,並把它放在你的onCreate(或onActivityCreated如果它是一個片段)方法,並把rangeRadio和meleeRadio爲您的活動私有變量(或片段)

然後,由於您使用的是鏈接的AsyncTasks,我不確定是否所有的onPostExecute都在您的UI線程上運行,所以我會盡量encapsulete所有調用rangeRadio.setText()像這樣的處理程序:

在您的活動的onCreate:

handler = new Handler(); 

然後設置您的文字時做到:

handler.post(new Runnable() { 

      public void run() { 
       rangeRadio.setText("..."); 

      } 
     }); 
0

TY幫助。在我急於找到一個良好的夜晚停留地點時,我忘記了設置AsyncTask來重新加載角色。所以當玩家沒有被攻擊時,setActions()並沒有被調用,因爲他們超出了範圍或玩家正在重新加載。