2014-08-19 9 views
0

Хорошо, ребята, это довольно простой вопрос, но это то, о чем я не совсем уверен. В приведенном ниже примере я построил простой калькулятор с двумя редакторами (для ввода номера) и двумя кнопками (добавление и вычитание). В настоящий момент мне нужно объявить все переменные/компоненты (например, кнопки, edittexts и т. Д.) В методах btnAdd и btnSub OnClick. Я имею в виду, что это только очень простая программа, но для повторного объявления всех этих переменных/компонентов (или как вы их называете?), Очевидно, будет действительно утомительно. Вы можете увидеть код, который у меня есть:Java: как объявить эти переменные как «глобальные»/общедоступные?

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)); 
     } 
    }); 

На данный момент, я получаю сообщение об ошибке в затмении, говоря «не может относиться к неконечному переменному внутри внутреннего класса, определенный в другом методе», поэтому я добавил «окончательное» ключевое слово перед переменные, за которые я получал ошибку. Проблема в том, что всякий раз, когда я пытаюсь запустить программу, она просто зависает, как только она загружается. Я надеюсь, это будет быстро исправить, хотя кто знает. Во всяком случае, спасибо заранее за любые ответы :)

+1

Почему бы не использовать обычный класс (вместо анонимного)? –

+0

Ваш второй код идеален - зачем вам нужно какое-либо ключевое слово вместе с ним? –

+0

@NinadPingale. Дело в том, что, как только я пытаюсь запустить второй код, я просто получаю это сообщение, говоря: «Невозможно запустить [название приложения Android]», ... – Sam

ответ

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) 

, который был мой опыт с написанием меньше коды для вещей, как этот

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(); 
    } 
}); 
} 
Смежные вопросы