首页 > 解决方案 > 活动对用户可见时立即触发事件

问题描述

我想在用户看到活动后立即创建倒计时。但是,似乎没有适当的回调。两者似乎都不onResume是正确的回调,因为整个代码在用户看到任何东西之前就已执行。onWindowFocusChanged结果,我以“Go!”结束。从一开始就在屏幕上。

简而言之:一旦活动对用户可见,您是否知道如何在没有任何用户交互的情况下实现倒计时?

编辑:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.util.concurrent.TimeUnit;
import android.widget.TextView;

public class ChallengeModeTutorial extends AppCompatActivity {

    private void delayOneSec()
    {
        try
        {
            TimeUnit.SECONDS.sleep(2);
        }
        catch (InterruptedException e)
        {
            assert true;
        }
    }

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

    @Override
    public void onWindowFocusChanged(boolean hasFocus)
    {
        super.onWindowFocusChanged(hasFocus);
        TextView readySteadyGo = (TextView) findViewById(R.id.challengeModeTutorialReadySteadyGoTextView);
        // TextView tutorialText = (TextView) findViewById(R.id.challengeModeTutorialTextTextView);
        TextView timeUntilStart = (TextView) findViewById(R.id.challengeModeTutorialReadyTimeTextView);

        readySteadyGo.setText("");
        timeUntilStart.setText("5");
        delayOneSec();
        timeUntilStart.setText("4");
        delayOneSec();
        timeUntilStart.setText("3");
        delayOneSec();
        readySteadyGo.setText("Ready!");
        timeUntilStart.setText("2");
        delayOneSec();
        readySteadyGo.setText("Steady!");
        timeUntilStart.setText("1");
        delayOneSec();
        readySteadyGo.setText("");
        readySteadyGo.setText("Go!");
    }
}

标签: androidandroid-activity

解决方案


问题是您阻塞了 UI 线程。当您调用setText(String)它时,它不会立即被绘制。TextView 失效,它将在下一个绘制阶段绘制。但是如果你阻塞线程,这将永远不会发生。您必须在一秒钟后使用 apostDelayed()来执行下一个。setText(String)


推荐阅读