Пропуск заставки
Я разработал заставку с кнопкой. Код 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();
}
});