#java #android #eclipse
#java #Android #eclipse
Вопрос:
Я хочу написать код расчета bmi в этой программе. Когда я указываю переменные «qad1», «vazn1», «bmi», «txtvazn», «txtqad» и «txtbmi» как final
, я столкнулся с этой ошибкой: «Конечная локальная переменная не может быть назначена», И когда я не указал их как final
, я столкнулся с этой ошибкой: не удается ссылаться на не окончательную локальную переменную, определенную во внешней области видимости._ измените модификатор на final. Я не мог решить эту проблему никаким трюком.Пожалуйста, помогите мне. Фото кодов загружены здесь.Спасибо.
public class Shakhes extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.shakhes);
final EditText txtvazn=(EditText) findViewById(R.id.txtvazn);
final EditText txtqad=(EditText) findViewById(R.id.txtqad);
final TextView txtbmi=(TextView) findViewById(R.id.txtbmi);
Button btnbmi=(Button) findViewById(R.id.btnbmi);
final int qad1;
final int vazn1;
final float bmi;
btnbmi.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
qad1=Integer.parseInt(txtqad.getText().toString());
qad1=qad1/100;
vazn1=Integer.parseInt(txtvazn.getText().toString());
bmi=vazn1/(qad1*qad1);
txtbmi.setText("" bmi);
}
});
}
}
Ответ №1:
Вы можете определить переменные внутри onClickListener
, если используете, используйте их только внутри listener:
(ОБНОВЛЕНИЕ, как отметил @DEADMC, final
в этом случае больше не требуется)
btnbmi.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
int qad1;
int vazn1;
float bmi;
// all other code
С другой стороны, если область действия переменной больше, чем прослушиватель, преобразуйте ее в массив из одного элемента:
final int[] qad1 = new int[] {0};
btnbmi.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
qad1[0] = ...
}
}
Комментарии:
1. в этом случае final не нужен =)
2. @DEADMC, да, точно. Спасибо за примечание
Ответ №2:
Пожалуйста, в первую очередь ознакомьтесь с преимуществами неизменяемости (угадайте ссылку http://okyasoft.blogspot.com/2014/05/6-benefits-of-programming-with_5146.html )
Для вашего примера, пожалуйста, попробуйте сделать все ссылки на переменные, которые вы пытаетесь использовать в OnClickListener — в качестве полей класса (вместо переменных метода).
Определение, например, txtbmi
как члена класса ( private TextView txtbmi;
) автоматически сделает его доступным для всех внутренних классов вашей Shakhes
деятельности.