Java:如何将这些变量声明为'global'/ public?

时间:2014-08-19 10:38:57

标签: java variables user-interface duplicates declare

好吧,伙计们,这是一个非常基本的问题,但这是我不能完全确定的事情。在下面的例子中,我构建了一个带有两个edittexts(用于数字输入)和两个按钮(加法和减法)的简单计算器。目前,我必须在btnAdd和btnSub OnClick方法中声明所有变量/组件(例如按钮,edittexts等)。我的意思是,这只是一个非常简单的程序,但是必须重新声明所有这些变量/组件(或者你称之为什么?)显然是非常乏味的。您可以看到我目前获得的代码:

    Button btnAdd = (Button)findViewById(R.id.btnAdd);
    Button btnSub = (Button)findViewById(R.id.btnSub);

    btnAdd.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            TextView textViewAns = (TextView)findViewById(R.id.TextViewAns);//here
            EditText editText1 = (EditText)findViewById(R.id.editText1);//...
            EditText editText2 = (EditText)findViewById(R.id.editText2);//...
            int num1 = Integer.parseInt(editText1.getText().toString());//...
            int num2 = Integer.parseInt(editText2.getText().toString());//...to here
            int total = num1 + num2;
            textViewAns.setText(Integer.toString(total));
        }
    });

    btnSub.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            TextView textViewAns = (TextView)findViewById(R.id.TextViewAns);
            EditText editText1 = (EditText)findViewById(R.id.editText1);
            EditText editText2 = (EditText)findViewById(R.id.editText2);
            int num1 = Integer.parseInt(editText1.getText().toString());
            int num2 = Integer.parseInt(editText2.getText().toString());
            int total = num1 - num2;
            textViewAns.setText(Integer.toString(total));
        }
    });

所以你可以看到所有重复。我想要达到的目标就像我在下面发布的那样,但无论如何我能做到这一点?

    Button btnAdd = (Button)findViewById(R.id.btnAdd);
    Button btnSub = (Button)findViewById(R.id.btnSub);
    final TextView textViewAns = (TextView)findViewById(R.id.TextViewAns);
    EditText editText1 = (EditText)findViewById(R.id.editText1);
    EditText editText2 = (EditText)findViewById(R.id.editText2);
    final int num1 = Integer.parseInt(editText1.getText().toString());
    final int num2 = Integer.parseInt(editText2.getText().toString());

    btnAdd.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            int total = num1 + num2;
            textViewAns.setText(Integer.toString(total));
        }
    });

    btnSub.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            int total = num1 - num2;
            textViewAns.setText(Integer.toString(total));
        }
    });

目前,我在eclipse中收到一个错误"无法引用在另一个方法中定义的内部类中的非final变量"因此我添加了" final&# 34;我收到错误的变量前面的关键字。现在的问题是,每当我尝试运行程序时,只要加载它就会冻结。虽然谁知道,但我会这是一个快速解决方案。无论如何,提前感谢任何答案:)

2 个答案:

答案 0 :(得分:0)

将代码包装在一个循环中然后使用最后的切换语句在两个选项之间进行选择就可以很简单了吗?

do {Button btnAdd = (Button)findViewById(R.id.btnAdd);
    Button btnSub = (Button)findViewById(R.id.btnSub);
    TextView textViewAns = (TextView)findViewById(R.id.TextViewAns);
    EditText editText1 = (EditText)findViewById(R.id.editText1);
    EditText editText2 = (EditText)findViewById(R.id.editText2);
    int num1 = Integer.parseInt(editText1.getText().toString());
    int num2 = Integer.parseInt(editText2.getText().toString());

    if(btnAdd.setOnClickListener(new View.OnClickListener()) {

        @Override
        public void onClick(View v) {
            int total = num1 + num2;
            textViewAns.setText(Integer.toString(total));
            break
        }
    });

    else if(btnSub.setOnClickListener(new View.OnClickListener()) {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            int total = num1 - num2;
            textViewAns.setText(Integer.toString(total));
            break;
        }
    });


   else continue;
    }while (true)

这是我为这样的东西编写更少代码的经验

答案 1 :(得分:0)

我认为最好的解决方案是将代码从匿名类移到其他类,例如:

class Foo{
  int things;
  void doSth(){}
}
class Bar{
  final Foo foo = new Foo();
  ...
  btnSub.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        foo.doSth();
    }
});
}