Пропуск заставки

Я разработал заставку с кнопкой. Код Java, как показано ниже. Макет заставки содержит несколько текстов с анимацией и кнопкой с названием пропущенного заставки. Когда пользователь нажимает кнопку, заставка должна немедленно остановиться и открыть следующее действие. Но когда я открываю заставку и нажимаю кнопку пропуска, открывается следующее действие, но по истечении времени, в течение которого должен работать заставка, снова открывается действие. Как остановить заставку, когда пользователь нажимает кнопку пропуска?

  public class Qz1 extends Activity {

        TextView a;
        TextView b;
        TextView c;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_qz1);
            a =(TextView)findViewById(R.id.roundOnea22);
            a.startAnimation(AnimationUtils.loadAnimation(Qz1.this, R.anim.anim_slide_in_left));
            b =(TextView)findViewById(R.id.roundOneb);
            b.startAnimation(AnimationUtils.loadAnimation(Qz1.this, R.anim.anim_slide_in_right));
            c =(TextView)findViewById(R.id.roundme);
            c.startAnimation(AnimationUtils.loadAnimation(Qz1.this, R.anim.anim_slide_in_left));




            Thread thread = new Thread(){

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    try{
                    sleep(3200);

                    startActivity(new Intent(getApplicationContext(), Qone.class));
                    } catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }
        };
        thread.start();

    }

    public void round1(View v){
       Intent i = new Intent(Qz1.this, Qone.class);
       startActivity(i);
    }
}

5 ответов

Решение

Предположим, вы хотите сохранить свое первое действие в фоновом режиме, но не хотите, чтобы поток повторно открыл второе действие, как только он закончил спать.

Чтобы добиться этого, вы можете сделать вашу "нить" глобальной переменной Thread учебный класс. Вы можете определить это как внутренний класс вашей деятельности:

MyThread thread;

и определение класса:

private class MyThread extends Thread
{
    public boolean bRun = true;

    @Override
    public void run()
    {
        try
        {
            sleep(3200);
            if (bRun)
            {
                startActivity(new Intent(getApplicationContext(), Activity2.class));
            }
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }

}

В onCreate(), ты пишешь

thread = new MyThread();
thread.start();

Затем вы можете изменить свой метод onClick следующим образом:

public void round1(View v){
   if (thread != null && thread.isAlive())
   {
       thread.bRun = false;
   }
   Intent i = new Intent(Qz1.this, Qone.class);
   startActivity(i);
}

Это предотвратит запуск потока вторым действием, если оно было запущено нажатием кнопки.

Не следует использовать сон (2000)

использовать анимационный прослушиватель ( http://developer.android.com/reference/android/view/animation/Animation.AnimationListener.html)

когда onAnimationEnd срабатывает вызов startActivity.

Рекомендуется использовать Async Tasks для сценариев ожидания / сна, например, для заставок, но требования могут отличаться.

В любом случае это мой способ вызвать заставку:

Создать AsyncTask первый.

private class SplashTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;

    }

    @Override
    protected void onPostExecute(Void result) {
        finish();

            Intent intent = new Intent(SplashActivity.this,
                    MainActivity.class);
            startActivity(intent);

        }
    }
}

Затем вызывайте это где хотите: по нажатию кнопки, при запуске или при создании:

new SplashTask().execute();

Я думаю, что лучшей практикой здесь будет использование обработчика.

Вы можете сделать это так:

public class Test extends AppCompatActivity{

private Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Settign the splashscreen with the button i suppose
    setContentView(R.id.splashcreen);
}

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

    handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            startNextActivity();
        }
    }, 2000);
}

public void startNextActivity(){
    startActivity(new Intent(getApplicationContext(), Qone.class));
}

public void skipSplashScreen(){
    if (handler != null)
        handler.removeCallbacksAndMessages(null);

    startNextActivity();
}

@Override
protected void onStop() {
    super.onStop();
    // clear handler on stop
    if (handler != null)
        handler.removeCallbacksAndMessages(null);
}
}

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

Попробуйте это в всплеск активности

Button button = (Button)findViewById(R.id.buttonLayout);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(this,TargetActivity.class));
                finish();
            }
        });
Другие вопросы по тегам