2012-04-13 80 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()并没有被调用,因为他们超出了范围或玩家正在重新加载。