一旦活动对用户可见,就立即触发事件

时间:2018-05-27 20:18:47

标签: android android-activity

我想在用户看到活动后立即创建倒计时。但是,似乎没有适当的回调。 onResumeonWindowFocusChanged似乎都不是正确的回调,因为整个代码在用户看到任何内容之前执行。结果我最终得到了“去!”从一开始就在屏幕上。

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

编辑:

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!");
    }
}

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我不确定这是否有效,但您可以尝试在onCreate中使用ViewTreeObserver。绘制布局后会调用它。 (将LinearLayout替换为您的" activity_challenge_mode_tutorial"实际上是什么布局。)

=MATCH(LEFT(C2),{"I","N","E","A","F"},0)

代码来自这个答案:https://stackoverflow.com/a/7735122/8118328

答案 2 :(得分:0)

您可以在onStart方法内部开始倒计时,您需要覆盖该方法。

  

活动的可见生命周期发生在对onStart()的调用之间,直到对onStop()的相应调用。在此期间,用户可以在屏幕上看到活动,但它可能不在前台并与用户交互。

来自: https://developer.android.com/reference/android/app/Activity

 @Override
protected void onStart() {
    super.onStart();
}

答案 3 :(得分:0)

我终于让它像这样工作:

newdata$DatetimeEnd <- as.POSIXct(data_tz$DatetimeEnd, format="%Y-%m-%d %H:%M:%S",tz="UTC +01")