質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

解決済

[Android] Toggleボタンの状態の保持

noriyo_tcp
noriyo_tcp

総合スコア15

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

1回答

0リアクション

2クリップ

7584閲覧

投稿2014/07/30 09:45

toggleボタンを押すとサービス開始(タイマー作動、ボタンの表記はResetになる)、またボタンを押すとサービス停止(タイマーリセット)というアプリを作っているのですが、バックグラウンドからアプリに復帰したときに、toggleボタンが元の状態に戻っていまいます(タイマーは動作を続けている)
どうすればボタンの状態を保持できるのでしょうか?

以下がコードです(一部省略)

MainActivity.java
`
// (一部省略)
import android.app.Activity;
import android.content.Intent;
// 以下必要なものをimport

public class MainActivity extends Activity implements OnCheckedChangeListener {

static TextView timer;
static ToggleButton toggle;
private static long settingTime = 60000;

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

timer = (TextView) findViewById(R.id.timer); toggle = (ToggleButton) findViewById(R.id.toggleButton1); // 初期時間設定 showTimer(getSettingTime()); // リスナ登録 toggle.setOnCheckedChangeListener(this);

}

TimerService timerTask = new TimerService();
private Intent timerIntent;

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// サービスを開始か停止
if (isChecked == true) {
Toast.makeText(this, "Start", Toast.LENGTH_SHORT).show();
// Start service
startService();
} else {
// Stop service
stopService(timerIntent);
// 設定した時間にリセット
showTimer(getSettingTime());
}
}

public void startService() {
// Serviceに設定時間を送ってサービス開始
timerIntent = new Intent(MainActivity.this, TimerService.class);
timerIntent.putExtra("settingTime", getSettingTime());

startService(timerIntent);

}
}
`

TimerService.java
`
// (一部省略)
import android.app.Service;
import android.content.Intent;
import android.os.CountDownTimer;
import android.os.IBinder;
import android.widget.Toast;

public class TimerService extends Service {
protected MyCountDownTimer cdt;

@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}

@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// タイマーのインスタンス生成&スタート
cdt = new MyCountDownTimer(intent.getExtras().getLong("settingTime"), 500);
cdt.start();

return super.onStartCommand(intent, flags, startId);

}

@Override
public void onDestroy() {
// タイマーインスタンスのキャンセル&破棄
cdt.cancel();
cdt = null;

super.onDestroy();

}

public class MyCountDownTimer extends CountDownTimer {
public MyCountDownTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
MainActivity.showTimer(millisInFuture);
}

@Override public void onFinish() { MainActivity.timer.setText("0:00"); Toast.makeText(getApplicationContext(), "Finished!", Toast.LENGTH_SHORT).show(); // 設定時間にリセット MainActivity.showTimer(MainActivity.getSettingTime()); // トグルボタンをfalse MainActivity.toggle.setChecked(false); // Stop service stopSelf(); } @Override public void onTick(long millisUntilFinished) { // 残り時間表示 MainActivity.showTimer(millisUntilFinished); }

}
}
`

試してみたのは

  • SharedPreferences(トグルボタンの状態を保持したい)
  • MainActivityのonResume()にいろいろ記述(ライフサイクルがよくわかってない)

などですが、うまくいきません。
Logを仕込んでみたところ、アプリがバックグラウンドに回ると、onPause() -> onStop()と状態遷移して、そこから復帰するときにonCreate() -> onStart() -> onResume()と遷移しているのは分かったのですけど、そこでデフォルトに戻ってしまっているのかな?と。(xmlでのToggleButtonの属性にandroid:checked="false"と記述している)
setChecked(Boolean)で指定してもコールバックメソッドを呼んでしまうので、どうしたものかなと。
長くなりましたが、とにかくトグルボタンの状態を保持したいのです。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。