[英]Java: the final local variable cannot be assigned, since it was defined in an enclosing type
[英]The final local variable cannot be assigned, since it is defined in an enclosing type?
希望能夠在最后創建一個變量,該變量具有時間和成本的值,最終將在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,因為它是用封閉類型定義的。”
這是什么意思,有什么辦法可以使用所有復選框更改此變量?
問題的原因是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;
}
}
});
更多信息:
我不知道為什么要首先使用midficator final
,如果您只是刪除它,您的代碼將運行良好,我不確定,但是我已經檢查過onClick
並且可以正常工作。 只需將它們設置為字段,就可以了
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.