1

アプリが開いているかどうかに関係なく実行される countDownTimer を制御するボタンを持つアプリを作成しています。タイマーが終了すると、ステータス バーに通知がポップアップ表示され、ユーザーに別のアクティビティを開始するよう促します。このタイマーは、x 回の間隔を増やしながら繰り返します。また、ユーザーが誤ってタイマーを複数回開始するのを防ぐために、最初に押した後にボタンを無効にします。カウントダウンの繰り返しサイクルが終了すると、ボタンが再び有効になります。

アクティビティを開いたままにしておくと、すべて正常に機能します...

私の問題は、BACKを押したときです。アクティビティを再度開くと、カウントダウン サイクルの終了後にボタンが再び有効になりません。アクティビティが破棄されると、変数「カウント」の状態が失われると思います。

私はプログラミングにまったく慣れていないので、助けていただければ幸いです。このコードがどれほど厄介であるかをお詫びします。それはまだ非常に進行中の作業です。前もって感謝します!

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    startB = (Button) this.findViewById(R.id.button);
    startB.setOnClickListener(this);
    countDownTimer = new MyCountDownTimer(times[count], interval);
    LoadPreferences();
    if (savedInstanceState !=null)
    {
        count = savedInstanceState.getInt("mCount");
    }
    else
    {
        count=0;
    }

}

@Override
public void onSaveInstanceState(Bundle savedInstanceState)
{
    savedInstanceState.putInt("mCount", count);
    super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onBackPressed(){
    SavePreferences();

    super.onBackPressed();
}

private void SavePreferences(){
    SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putInt("mCount", mCount);
    editor.putBoolean("state", startB.isEnabled());
    editor.commit();
}

private void LoadPreferences(){
    SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    int mCount = sharedPreferences.getInt("count", mCount);
    Boolean state = sharedPreferences.getBoolean("state",true);
    startB.setEnabled(state);
    mCount = count
}




            public void onClick(View v)
                {
                    if (!timerHasStarted)
                        {
                            countDownTimer.start();
                            timerHasStarted = true;
                            Toast t= Toast.makeText(this,"Timer Started", Toast.LENGTH_SHORT);
                            t.show();
                        }
                    else
                        {
                            startB.setEnabled(false);

                        }
                }

            // CountDownTimer class
            public class MyCountDownTimer extends CountDownTimer
                {

                    public MyCountDownTimer(long startTime, long interval)
                        {
                            super(startTime, interval);
                        }

                    @Override
                    public void onFinish()
                        {

                        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getBaseContext())
                        .setSmallIcon(R.drawable.ic_launcher)
                        .setContentTitle("ASL Teacher")
                        .setContentText("Play Lesson One");
                        //Intent resultIntent= new Intent();
                        //TaskStackBuilder stackBuilder = TaskStackBuilder.create(MainActivity.this);
                        //stackBuilder.addParentStack(NextActivity.class);
                        //stackBuilder.addNextIntent(resultIntent);
                        //PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
                        //mBuilder.setContentIntent(resultPendingIntent);
                            NotificationManager mNotificationManager =
                            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

                        // mId allows you to update the notification later on.
                        mNotificationManager.notify(0, mBuilder.build());


                        Vibrator v= (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                        v.vibrate(pattern,-1);

// トースト t= Toast.makeText(getApplicationContext(),"Times Up "+String.valueOf(times[count]),Toast.LENGTH_SHORT); // t.show(); カウント++;

                        if (count < 3)
                        {

                            countDownTimer = new MyCountDownTimer(times[count], interval);
                            countDownTimer.start();
                        }

                        else
                        {
                        count=0;
                            startB.setEnabled(true);
                            timerHasStarted=false;

                        }


                        }
4

2 に答える 2

0

質問がまだ関連しているかどうかはわかりません。

変数 mCount が表示される場所を確認する必要があります。LoadPreferences では、未定義の値をデフォルトとして使用して、「mCount」を mCount に読み込みます。次に、mCount=count を実行して読み取り値を削除します。count=mCount ということですか?

onCreate で LoadPreferences を実行した後、savedInstanceState に従ってカウントのみを設定します。そのため、カウントするために LoadPreferences が行うことはすべて無視されます。BACK を押してアクティビティを強制終了した後にアクティビティが開始されると、savedInstanceState は null になりますが、設定で別の指示がある場合はカウントを 0 にする必要はありません。

于 2014-12-18T13:08:40.320 に答える
0

この代わりに、カウントダウンタイマーのキャンセルメソッドを使用して残り時間を保存し、アクティビティの再開メソッドで新しいカウントダウンタイマーを開始します

于 2016-06-15T09:24:45.180 に答える