首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TextView.setText()用于按钮按下,但不适用于CountDownTimer

TextView.setText()用于按钮按下,但不适用于CountDownTimer
EN

Stack Overflow用户
提问于 2013-07-03 02:36:46
回答 2查看 4K关注 0票数 1

我有一个实现一些按钮和计数器的类,当我按下一个按钮时,我需要在TextView中设置一些文本来设置其他内容。这并不是什么疯狂的事情,这就是为什么我不能理解为什么它不能工作。

有效的按钮onClick方法:

代码语言:javascript
复制
public class Main extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        LinearLayout linLayout = (LinearLayout)findViewById(R.id.main_view);

        Button button_2 = new Button(this);
        button_2.setText("2");
        button_2.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                setValues(2, 2);
                ((TextView)findViewById(R.id.counter_label)).setText("You Pressed 2");
                updateScrollText();
                startTimer(200000);
            }
        }
        linLayout.addView(button_2);
    }


    public void setValues(int first, int second);
        this.first = first;
        this.second = second;
    }
...

但是当我试着把它放到我的计时器中时:

代码语言:javascript
复制
private void startTimer(long time){
    counter = new CountDownTimer(time, 1000){
        public void onTick(long millisUntilDone){

           Log.d("counter_label", "Counter text should be changed");
           ((TextView)findViewById(R.id.counter_label)).setText("You have " + millisUntilDone + "ms");                    
        }

        public void onFinish() {
            ((TextView)findViewById(R.id.counter_label)).setText("DONE!");

        }
    }.start();
}

令人沮丧的是,LogCat在每个节拍上都显示“计数器文本应该被更改”,就像它应该显示的那样,它实际上并没有更改文本。有什么线索吗?我已经清理了项目,其他一切都正常工作。

我还注意到另一个计数器定时器正在做类似的事情(显示时间,直到它完成)是100%工作,我没有触摸它,现在它也没有设置文本。它会在1秒后停止更改文本,但计数器会继续倒计时。

EN

回答 2

Stack Overflow用户

发布于 2013-07-03 02:55:40

您的计时器可能没有在UI线程上运行,但只有UI线程可以操作UI。只需将您的setText包装如下(假设您正在进行一项活动):

代码语言:javascript
复制
runOnUiThread(new Runnable() {

        @Override
        public void run() {
            ((TextView)findViewById(R.id.counter_label)).setText("You have " + millisUntilDone + "ms");
        }
});
票数 1
EN

Stack Overflow用户

发布于 2013-07-03 03:36:20

我采用了你发布的代码,对它进行了一些修改,我不得不说它对我来说很有效。看看这个:

代码语言:javascript
复制
public class MainActivity extends Activity {

TextView tvCountdown;
Button btnCountdownStarter;

int mFirst;
int mSecond;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    tvCountdown = (TextView) findViewById(R.id.tvCountdown);
    tvCountdown.setText("timer");

    btnCountdownStarter = (Button) findViewById(R.id.btnCountdownStarter);
    btnCountdownStarter.setText("button");
    btnCountdownStarter.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v){
            setValues(2, 2);

            tvCountdown.setText("You pressed 2");

            startTimer(20*1000);
        }
    });     

    }

    public void setValues(int first, int second) {
        mFirst = first;
        mSecond = second;
    }


    private void startTimer(long time) {
        new CountDownTimer(time, 1*1000) {
            public void onTick(long millisUntilFinished) {
                tvCountdown.setText("seconds remaining: " + millisUntilFinished / 1000);                
            }

            public void onFinish() {
                tvCountdown.setText("done!");
            }
        }.start();
}

}

我唯一修改的是在xml文件中创建两个视图,而不是在onCreate方法中。activity_main文件:

代码语言:javascript
复制
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<TextView
    android:id="@+id/tvCountdown"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<Button
    android:id="@+id/btnCountdownStarter"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/tvCountdown" />

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17433261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档