Я пытаюсь получить объект TextView, используя view.findViewById() в функции, которая вызывается при нажатии кнопки. В onClickButton() возвращается null, тогда как в другой функции setDefaultValues() все работает нормально.
Activity1.java
public class Activity1 extends AppCompatActivity {
private final Double TIP = 10.0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_1);
setDefaultValues();
}
private void setDefaultValues() {
TextView tipView = findViewById(R.id.tipView);
tipView.setText(getString(R.string.main_msg_tip,Double.toString(TIP)));
}
public void onClickToggleButton(View view){
TextView tipView = view.findViewById(R.id.tipView);
switch (view.getId()) {
case (R.id.toggleButtonBad):
tipView.setText(getString(R.string.main_msg_tip, Double.toString(BAD)));
break;
}
}
При тестировании приложения было показано следующее сообщение об ошибке:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object referenceat com.example.chandan.learning.Activity1.onClickToggleButton
Редактировать: файл activity_1.xml
содержит TextView
с идентификатором tipView
, поэтому теория о том, что элемент отсутствует в файле XML, выходит за рамки.
Удалить TextView tipView = view.findViewById(R.id.tipView); внутри onClickToggleButton
Почему существует реализация дваtipView
? Удалите один из onClickToggleButton
@МанойПерумарат github.com/chandan00761/ERRORS/blob/master/activity_1.xml
@RakshitNawani Объясните новичку, пожалуйста
удалите view.findViewById(R.id.tipView);
и замените всю эту строку на эту TextView tipView = findViewById(R.id.tipView);
. Этот view
является объектом представления кнопки.
@ChandanMahto: вы передаете Посмотреть вид внутри onClickToggleButton
, поэтому он дает только идентификатор кнопок, в которых определен onClick, поэтому он не будет иметь контекст tipView
, поэтому из-за этого он даст вам NPE
Дублировать код — плохая практика. Теперь у вас есть дублирование метода findViewById
. Чтобы этого избежать, вы должны создать глобальную переменную в классе Activity1
. Это также будет решением вашей проблемы:
public class Activity1 extends AppCompatActivity {
private final Double TIP = 10.0;
private TextView tipView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_1);
setDefaultValues();
}
private void setDefaultValues() {
tipView = findViewById(R.id.tipView);
tipView.setText(getString(R.string.main_msg_tip, Double.toString(TIP)));
}
public void onClickToggleButton(View view) {
switch (view.getId()) {
case (R.id.toggleButtonBad):
tipView.setText(getString(R.string.main_msg_tip, Double.toString(BAD)));
break;
}
}
}
Вы пытаетесь найти представление внутри щелкнутого представления (например, кнопка), в то время как «tipView» находится в контейнере основного представления. Поэтому обновите свой метод onClickToggleButton, как показано ниже:
public void onClickToggleButton(View view) {
TextView tipView = findViewById(R.id.tipView);
switch (view.getId()) {
case (R.id.toggleButtonBad):
tipView.setText(getString(R.string.main_msg_tip, Double.toString(BAD)));
break;
}
}
поделитесь также своим xml