Запустить событие, как только активность станет видна пользователю - PullRequest
0 голосов
/ 27 мая 2018

Я хотел создать обратный отсчет, как только пользователь увидит активность.Однако, похоже, для этого нет подходящего обратного вызова.Ни 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!");
    }
}

Ответы [ 4 ]

0 голосов
/ 28 мая 2018

Я наконец-то заставил его работать так:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class ChallengeModeTutorial extends AppCompatActivity {

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

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

        final TextView readySteadyGo = (TextView) findViewById(R.id.challengeModeTutorialReadySteadyGoTextView);
        final TextView timeUntilStart = (TextView) findViewById(R.id.challengeModeTutorialReadyTimeTextView);

        readySteadyGo.setText("");

        Thread t=new Thread(){

            @Override
            public void run(){

                while(continueThread){

                    try {
                        Thread.sleep(1000);

                        runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                if(currentCount > 0)
                                {
                                    timeUntilStart.setText(String.valueOf(currentCount));
                                }
                                else
                                {
                                    timeUntilStart.setText("Go!");
                                }
                                switch (currentCount)
                                {
                                    case 2: readySteadyGo.setText("Ready!"); break;
                                    case 1: readySteadyGo.setText("Steady!"); break;
                                    default: readySteadyGo.setText(""); break;
                                }
                                currentCount--;
                                if (currentCount == 0)
                                {
                                    continueThread = false;
                                }
                            }
                        });

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }
        };

        t.start();
    }

    private boolean continueThread = true;
    private int currentCount = 5;
}
0 голосов
/ 27 мая 2018

Вы можете начать обратный отсчет внутри метода onStart, который необходимо перезаписать.

Видимое время жизни действия происходит между вызовом onStart () и соответствующим вызовом onStop ().В течение этого времени пользователь может видеть действие на экране, хотя оно может не находиться на переднем плане и взаимодействовать с пользователем.

От:https://developer.android.com/reference/android/app/Activity

 @Override
protected void onStart() {
    super.onStart();
}
0 голосов
/ 28 мая 2018

Проблема в том, что вы блокируете поток пользовательского интерфейса.Когда вы звоните setText(String), он не сразу обращается.TextView становится недействительным, и он будет нарисован на следующем этапе рисования.Но если вы заблокируете поток, это никогда не произойдет.Вы должны использовать postDelayed(), чтобы выполнить следующую setText(String) секунду позже.

0 голосов
/ 27 мая 2018

Я не уверен, что это работает, но вы можете попробовать использовать ViewTreeObserver в onCreate.Он вызывается после отрисовки макета.(Замените LinearLayout на то, каким является ваш Layout "activity_challenge_mode_tutorial".)

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

    final LinearLayout layout = (LinearLayout) findViewById(R.id.YOUR_VIEW_ID);
    ViewTreeObserver vto = layout.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener (new OnGlobalLayoutListener() { 
        @Override 
        public void onGlobalLayout() {
            // Remove listener to prevent repeat calls.
            layout.getViewTreeObserver().removeOnGlobalLayoutListener(this); 

            // Start countdown here.

        } 
    });
}

Код взят из этого ответа: https://stackoverflow.com/a/7735122/8118328

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...