View.findViewById() возвращает null в одной функции, но отлично работает в другой

Я пытаюсь получить объект 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, выходит за рамки.

поделитесь также своим xml

Manoj Perumarath 29.05.2019 06:22

Удалить TextView tipView = view.findViewById(R.id.tipView); внутри onClickToggleButton

Manoj Perumarath 29.05.2019 06:23

Почему существует реализация дваtipView? Удалите один из onClickToggleButton

Rakshit Nawani 29.05.2019 06:24

@МанойПерумарат github.com/chandan00761/ERRORS/blob/master/activity_1.xml

Chandan Mahto 29.05.2019 06:26

@RakshitNawani Объясните новичку, пожалуйста

Chandan Mahto 29.05.2019 06:28

удалите view.findViewById(R.id.tipView); и замените всю эту строку на эту TextView tipView = findViewById(R.id.tipView);. Этот view является объектом представления кнопки.

Dhruv 29.05.2019 06:31

@ChandanMahto: вы передаете Посмотреть вид внутри onClickToggleButton, поэтому он дает только идентификатор кнопок, в которых определен onClick, поэтому он не будет иметь контекст tipView, поэтому из-за этого он даст вам NPE

Rakshit Nawani 29.05.2019 06:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
7
89
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Дублировать код — плохая практика. Теперь у вас есть дублирование метода 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;
        }
    }

Другие вопросы по теме

Похожие вопросы

(Обработка) Создание второго окна делает главное очень маленьким
Как выровнять JButtons, используя 2 объекта JPanel, чтобы сформировать базовый графический интерфейс Java
Разделить текст с помощью регулярного выражения в Java
Запуск функции после открытия приложения в фоновом режиме после нажатия уведомления
Сравнение строк возвращает false, хотя они имеют одинаковое значение
Нужно ли нам беспокоиться о 32-битных или 64-битных целых числах, или мы в порядке, просто используя 'int'
Высокое использование оперативной памяти и один и тот же процесс, отображаемый несколько раз?
Почему этот цикл for не работает в java?
Почему я не могу заставить свой красный шар остановиться на синем ящике с помощью robot.getPixelColor?
Как отсортировать карту без использования сопоставимого интерфейса и интерфейса компаратора? Как написать пользовательскую сортировку?