如果语句只在onresume()上完全运行

时间:2012-04-13 06:31:30

标签: android if-statement radio-button settext

我正在尝试设置一个战斗系统,允许用户在近战攻击和远程攻击之间进行选择(从两个单选按钮中选择一个)。基于变量按钮可以说什么动作,“超出范围”,“攻击近战”,“攻击范围”,“重新加载范围”。 onresume radioButtons具有正确的文本。在第一次发射远程武器之后(已经重新加载远程武器开始战斗)rangeRadio的文本变为“重新加载范围”,但即使武器被“重新加载”,也不会从“重新加载范围”变回“攻击范围”当我结束转弯时(和预先形成设定的动作)将触发造成伤害。如果武器需要2转才能重装。我花了2转重装,点击主页按钮然后返回活动它将正确设置文本并说“范围攻击”,否则它将保持“重新加载范围”。

找到radioButtons,if语句首先检查是否有远程武器装备(rangeId == 50表示没有武器)然后检查武器是否装载(int rangeReload = 100),然后最后检查是否在范围内攻击/射击。

    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通过preCombat() - &gt; 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();
        }
    }

我不明白为什么在设置rangeRadio时似乎停止了我的if语句,但是onResume允许它一直完成并显示rangeRadio的正确文本。

2 个答案:

答案 0 :(得分:0)

只是一个建议,尝试移动

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

在onResume方法之外,并将其放在onCreate(或onActivityCreated,如果它是一个片段)方法上,并将rangeRadio和meleeRadio作为私有变量放在您的活动(或片段)中

然后,由于你使用的是链接的AsyncTasks,我不确定你的所有onPostExecute是否都在你的UI线程上运行,所以我会尝试将你对rangeRadio.setText()的所有调用封装在这样的处理程序上:< / p>

关于你的活动onCreate:

handler =  new Handler();

然后在设置文本时执行:

handler.post(new Runnable() {

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

            }
        });

答案 1 :(得分:0)

TY帮助。我急忙找到一个好的停止场所,我忘了在角色重新加载时设置AsyncTask。所以当玩家没有进攻时因为超出范围或玩家正在重装时没有调用setActions()。

相关问题