2015-05-11 14 views
1

希望能够在最后创建一个具有“时间”和“成本”值的变量,并最终显示在TextView中。尽管我遇到了一个问题。由于在封闭类型中定义了最终局部变量,因此无法分配?

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final int intTime = 30; 
    final int intCost = 10; 

    CheckBox CP = (CheckBox)findViewById(R.id.checkPepperoni); 
    CheckBox CS = (CheckBox)findViewById(R.id.checkSausage); 
    CheckBox CB = (CheckBox)findViewById(R.id.checkBacon); 
    CheckBox CM = (CheckBox)findViewById(R.id.checkMushroom); 

    final ImageView cheese =(ImageView)findViewById(R.id.imgCheese); 
    final ImageView pepperoni =(ImageView)findViewById(R.id.imgPepperoni); 
    final ImageView sausage =(ImageView)findViewById(R.id.imgSausage); 
    final ImageView bacon =(ImageView)findViewById(R.id.imgBacon); 
    final ImageView mushroom =(ImageView)findViewById(R.id.imgMushroom); 

    final SharedPreferences sharedPref =PreferenceManager.getDefaultSharedPreferences(this); 



    CP.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ 
         //Pepperoni Listener 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked1) { 
      // TODO Auto-generated method stub 

        if(isChecked1){      

         pepperoni.setImageResource(R.drawable.pepperoni); 
         intTime = intTime + 6; 
         intCost = intCost + 5; 
        } 
        else{ 

         pepperoni.setImageResource(0); 
         intTime = intTime - 6; 
         intCost = intCost - 5; 
        } 

    }}); 

    CS.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ 
        //Sausage Listener 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked2) { 
      // TODO Auto-generated method stub 

        if(isChecked2){      

         sausage.setImageResource(R.drawable.sausage); 
         intTime = intTime + 6; 
         intCost = intCost + 5; 

        } 
        else{ 

         sausage.setImageResource(0); 
         intTime = intTime - 6; 
         intCost = intCost - 5; 

        } 

    }}); 

    CB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked3) { 
      // TODO Auto-generated method stub 

        if(isChecked3){      

         bacon.setImageResource(R.drawable.bacon); 
         intTime = intTime + 6; 
         intCost = intCost + 5; 

        } 
        else{ 

         bacon.setImageResource(0); 
         intTime = intTime - 6; 
         intCost = intCost - 5; 

        } 

    }}); 

    CM.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked4) { 
      // TODO Auto-generated method stub 

        if(isChecked4){      

         mushroom.setImageResource(R.drawable.mushroom); 
         intTime = intTime + 6; 
         intCost = intCost + 5; 

        } 
        else{ 

         mushroom.setImageResource(0); 
         intTime = intTime - 6; 
         intCost = intCost - 5; 

        } 

    }}); 


    ImageButton IB = (ImageButton)findViewById(R.id.imgBtnGo); 
    IB.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      String time = Integer.toString(intTime); 
      String cost = Integer.toString(intCost); 

      SharedPreferences.Editor editor = sharedPref.edit(); 
      editor.putString("keyTime", time); 
      editor.putString("keyCost", cost); 

      startActivity(new Intent(MainActivity.this, ResultActivity.class)); 

     } 

    }); 
} 

} 

我运行到的错误是,“最终的局部变量intCost不能被分配,因为它是在一个封闭的类型来定义。”

这是什么意思,是否有任何方法可以使用所有复选框更改此变量?

+0

你知道'final'是什么意思吗? – immibis

回答

1

问题的原因是final变量在声明时应该初始化,并且不能被重新分配。对于这种情况,最好的办法是在匿名类中创建以最终变量值开始的内部字段,并且定期更新内部字段。

例子:

CP.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    //Pepperoni Listener 
    int innerTime = intTime; 
    int innerCost = intCost; 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked1) { 
     if(isChecked1) { 
      pepperoni.setImageResource(R.drawable.pepperoni); 
      innerTime += 6; 
      innerCost += 5; 
     } else { 
      pepperoni.setImageResource(0); 
      innerTime -= 6; 
      innerCost -= 5; 
     } 
    } 
}); 

更多信息:

+0

你有可能向我展示一个看起来像什么的例子吗?我不太明白“匿名班”和“内地”的含义。 –

+0

答复已更新。 –

+0

这可能不适用于OP,因为更新内部变量对其他人不可见。 – ZhongYu

0
我不能你为什么排在首位使用midficator final

,你的代码将,如果你工作得很好只是删除它,我不知道,但我检查了onClick,它的工作。只是让它们成为领域,而且它会很好

+0

它不会。在Java中,除非它们是“final”,否则不能直接在匿名类中使用方法中的变量。 –

+0

为什么你不想让他们成为类字段而不是局部变量? –

+0

删除最终产生的错误“不能引用在封闭范围中定义的非最终本地变量intTime” –

相关问题