4

ボタン付きのスプラッシュスクリーンをデザインしました。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);
    }
}
4

5 に答える 5

2

最初のアクティビティをバックグラウンドで保持したいが、スレッドがスリープを終了してもすぐに 2 番目のアクティビティを再開したくないとします。

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

これにより、ボタンをクリックしてスレッドが開始された場合、スレッドは 2 番目のアクティビティを開始しなくなります。

于 2015-11-18T13:05:07.433 に答える
1

sleep(2000) を使用すべきではありません

animationlistener を使用します ( http://developer.android.com/reference/android/view/animation/Animation.AnimationListener.html )

onAnimationEnd がトリガーされたら、startActivity を呼び出します。

于 2015-11-18T12:53:15.270 に答える
1

スプラッシュ スクリーンなどの待機/スリープ シナリオでは非同期タスクを使用することをお勧めしますが、要件は異なる場合があります。

とにかく、これはスプラッシュスクリーンを呼び出す私の方法です:

最初のものを作成します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();
于 2015-11-18T12:50:47.230 に答える
1

ここでのベストプラクティスは、ハンドラーを使用することだと思います。

次のように実行できます。

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() を呼び出して次のアクティビティに手動で移動します。

于 2015-11-18T13:15:31.983 に答える
0

スプラッシュアクティビティでこれを試してください

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();
            }
        });
于 2015-11-18T12:57:53.643 に答える