【问题标题】:How to switch TextView between values every 5 seconds如何每 5 秒在值之间切换 TextView
【发布时间】:2019-10-13 21:59:22
【问题描述】:

我不知道使用 Threads 是否是我想要达到的目标,因此请随时根据需要修改代码。

我正在尝试在我的应用程序中实现一个功能,其中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();

我尝试在runUiOnThread 之后以及嵌套的run 之后添加layoutDate.setText(firstNumber),但它仍然无法按我的意愿工作。

我想实现以下目标:

【问题讨论】:

  • 改用处理程序
  • 当前状态下的代码在做什么?
  • @RicardoA。所以onCreate 设置为layoutDate.setText(firstNumber),然后在5 秒后设置layoutDate.setText(secondNumber)。问题是它不会恢复到第一个数字,无论我在线程中添加layoutDate.setText(firstNumber) 的位置
  • 没听懂。它创建它并设置初始值,5 秒后设置第二个值。当你希望它恢复到第一个?再过 5 秒?
  • @RicardoA。是的——就是这样。 1. onCreate 设置 firstValue 2. 等待 5 秒 3. 设置 secondValue 4. 等待 5 秒 5. setFirstValue

标签: java android textview android-runonuithread


【解决方案1】:

验证字段中的当前数字并更改为另一个,您可以通过获取值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);
}

【讨论】:

  • 更好的方法是使用 lambdas 将可运行对象发布到 layoutDate 本身,而不是使用新的处理程序或新线程。这样,一旦视图失效,runnable 就会被清除。
【解决方案2】:

您可以将 Handler 与可运行对象一起使用。

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

可运行以每 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 每次更改文本时更改文本颜色。与textView.setText() 一起添加textView.setTextColor() 并为该文本设置所需的颜色。 Here 是一个答案,提供了在运行时更改文本颜色的各种选项。
  • 完成。 :D 我刚刚在if else 中调用了textView.setTextColor()。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
相关资源
最近更新 更多