Как переключать TextView между значениями каждые 5 секунд

Я не знаю, является ли использование Потоки практикой для того, чего я пытаюсь достичь, поэтому, пожалуйста, не стесняйтесь вносить изменения в код, где хотите.

Я пытаюсь реализовать функцию в своем приложении, где TextView переключается на 1 значение, а затем возвращается к исходному значению каждые 5 секунд. Я реализовал следующее использование в потоке:

    layoutDate.setText(firstNumber);

    Thread numberSwitch = new Thread() {
    @Override
    public void run() {
        while(!isInterrupted()) {
            try {

                Thread.sleep(5000);

                runOnUiThread(new Runnable () {
                    @Override
                    public void run() {

                        layoutDate.setText(secondNumber);                   

                    }
                });
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }       
    }
};

numberSwitch.start();

Я пытался добавить layoutDate.setText(firstNumber) сразу после runUiOnThread, а также после вложенного run, но это все равно не работает, как я хочу.

Я хочу добиться чего-то вроде следующего:

Как переключать TextView между значениями каждые 5 секунд

Вместо этого используйте обработчик

MilaDroid 28.05.2019 13:24

Что делает код в текущем состоянии?

Ricardo A. 28.05.2019 13:25

@РикардоА. поэтому onCreate устанавливается layoutDate.setText(firstNumber), а затем через 5 секунд устанавливается layoutDate.setText(secondNumber). Проблема в том, что он не возвращается к первому числу, независимо от того, где я добавляю layoutDate.setText(firstNumber) в потоке.

Adam 28.05.2019 13:28

Не понял. Он создает его и устанавливает начальное значение, через 5 секунд устанавливает второе значение. Когда вы хотите, чтобы он вернулся к первому? Еще через 5 секунд?

Ricardo A. 28.05.2019 13:33

@РикардоА. Ага - это точно. 1. onCreate установить firstValue 2. Подождать 5 секунд 3. Установить secondValue 4. Подождать 5 секунд 5. setFirstValue

Adam 28.05.2019 13:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
125
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проверьте текущий номер, который находится в поле, и измените его на другой, вы можете сделать это, получив значение layoutDate.getText().toString() или используя новую переменную для хранения значения.

layoutDate.setText(firstNumber);

    Thread numberSwitch = new Thread() {
    @Override
    public void run() {
        while(!isInterrupted()) {
            try {

                Thread.sleep(5000);

                runOnUiThread(new Runnable () {
                    @Override
                    public void run() {

                        if (currentNumber == firstNumber){
                            currentNumber = secondNumber;
                        }else{
                            currentNumber = firstNumber;
                        }
                        layoutDate.setText(currentNumber);
                    }
                });
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }       
    }
};

numberSwitch.start();

Или

if (layoutDate.getText().toString().equals(firstNumber+"")){
    layoutDate.set(secondNumber);
}else{
    layoutDate.set(firstNumber);
}

Лучшим способом может быть публикация исполняемого файла с использованием лямбда-выражений в самой layoutDate вместо использования нового обработчика или нового потока. Таким образом, runnable будет очищен, как только представление станет недействительным.

Rahul Shukla 28.05.2019 14:15
Ответ принят как подходящий

Вы можете использовать Handler с runnable.

private TextView textView;
private Handler handler;

в вашем onCreate()

textView = findViewById(R.id.tv_bt_msg);
textView.setText("secondNumber");

handler = new Handler();
//Change the textview after 5 seconds
handler.postDelayed(runnable, 5000);

Runnable для изменения текста каждые 5 секунд

private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            String currentString = textView.getText().toString();
            if (currentString.equals("secondNumber")){
                currentString = "firstNumber";
            }else{
                currentString = "secondNumber";
            }
            final String tempString = currentString;
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    textView.setText(tempString);
                }
            });
            //Change the textview again after 5 seconds
            handler.postDelayed(runnable, 5000);
        }
    };

Используйте это, чтобы удалить обратные вызовы

handler.removeCallbacks(runnable);

Это сработало блестяще @Arun. У меня небольшая проблема с цветом textView. При настройке secondNumber я установил изменение цвета. Можно ли вернуть цвет обратно к исходному, когда он снова переключается на firstNumber, используя вашу реализацию выше?

Adam 29.05.2019 10:43

@Adam Меняйте цвет текста каждый раз, когда меняете текст. Наряду с textView.setText() добавьте textView.setTextColor() и установите цвет, который вы хотите для этого текста. Здесь — это ответ с различными вариантами изменения цвета текста во время выполнения.

Arun 29.05.2019 10:53

Сделанный. :D Я только что позвонил textView.setTextColor() в if else. Спасибо :)

Adam 29.05.2019 10:57

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