1

我有一个实现一些按钮和计数器的类,当我按下按钮时,我需要将 TextView 中的一些文本设置为其他内容。这不是什么疯狂的事情,这就是为什么我不明白为什么它不起作用。

有效的按钮 onClick 方法:

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;
    }
...

但是当我尝试将它放在我的计时器中时:

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 秒后停止更改文本,但计数器继续倒计时。

4

2 回答 2

1

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

runOnUiThread(new Runnable() {

        @Override
        public void run() {
            ((TextView)findViewById(R.id.counter_label)).setText("You have " + millisUntilDone + "ms");
        }
});
于 2013-07-02T18:55:39.540 回答
1

我采用了您发布的代码,对其进行了一些修改,我不得不说它对我有用。一探究竟:

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 方法中。活动主文件:

<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" />

于 2013-07-02T19:36:19.903 回答