Ваш урезанный код выглядит так:
public class MainActivity extends AppCompatActivity {
String right = getString(R.string.right);
String wrong = getString(R.string.wrong);
String translation1 = getString(R.string.translation1);
}
То, что происходит, когда вы вызываете getString()
, довольно сложно, но важно понять, что для этого требуется объект Resources
. Этот Resources
объект не «готов» сразу, когда создается экземпляр вашей активности, и именно тогда вы пытаетесь вызвать getString()
.
В общем, дождитесь вызова super.onCreate()
, прежде чем пытаться получить доступ к структуре ресурсов; это включает в себя вызов getString()
.
Вы можете исправить это, изменив код так, чтобы он выглядел следующим образом:
public class MainActivity extends AppCompatActivity {
private String right;
private String wrong;
private String translation1;
private EditText input1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.right = getString(R.string.right);
this.wrong = getString(R.string.wrong);
this.translation1 = getString(R.string.translation1);
this.input1 = (EditText) findViewById(R.id.input1);
}
public void Check(View view) {
String string1 = input1.getText().toString();
if (string1.equals(translation1)) {
input1.setText(right);
}
else {
input1.setText(wrong);
}
}
}
Важная вещь, которую мы здесь сделали, - это перенести присваивание right
, wrong
, translation1
и input1
в наш onCreate()
метод. Мы также гарантируем, что вызовы getString()
происходят после super.onCreate()
, а вызов findViewById()
происходит после setContentView()
. Порядок очень важен.
Наконец, нет причины присваивать значение string1
, пока ваш Check()
метод не будет вызван. Таким образом, мы гарантируем, что мы работаем с самым последним значением из нашего EditText
.