前提・実現したいこと
タイマー機能を実装したいです。
Fragmentにタイマーの残り時間を表示するGUIを配置、
タイマー処理をするクラス(以下、タイマークラス)を別に作成しています。
タイマークラスからFragmentに残り時間の値を渡し、FragmentのGUIに表示させたいです。
発生している問題・エラーメッセージ
画面回転や画面遷移してもタイマーがバックグラウンドで稼働し続けるようにしたく、タイマークラスのonTickメソッドから直接FragmentのGUIに値を設定できないかと思っています。
試したこと
FragmentのGUIのidをタイマークラスで指定して、値を渡せないかと試してみましたがうまくいきません。
Java
1 2package com.example.mynavigationdrower.Workout; 3 4import android.os.CountDownTimer; 5import android.widget.NumberPicker; 6 7import com.example.mynavigationdrower.R; 8 9public class MyCountDownTimer extends CountDownTimer { 10 11 public int tmp_minute, tmp_second; 12 13 public MyCountDownTimer(long millisInFuture, long contDownInterval) { 14 super(millisInFuture, contDownInterval); 15 16 } 17 18 @Override 19 public void onTick(long millisUntilFinished) { 20 21 tmp_minute = (int) millisUntilFinished / 60 / 1000; 22 tmp_second = (int) (millisUntilFinished - tmp_minute * 60 * 1000) / 1000; 23 24 Fragment mfragment = new Fragment(); 25 NumberPicker NP_minute = (NumberPicker) mFragment.v.findViewById(R.id.NP_Minute); 26 NP_minute.setValue(tmp_minute); 27 } 28}
画面を回転したら Fragment は作り直されますし、画面遷移したらそもそも Fragment は消滅してるかも知れないので、アプリを切り替えても有効なタイマーにしたいのであればタイマーの通知は Fragment ではなくアプリ全体の責務として考えるべきでは?
古い記事ですが、たとえばこれとか。
https://kimihiro-n.appspot.com/show/5812766862475264
ご回答まことにありがとうございます。
ご指摘の内容について、以下のように確認してみました。
<確認内容>
デバックモードでタイマークラスのonTickの中の「tmp_minute」「tmp_second」を監視し、画面の回転・他Fragmentや他アプリへの遷移をさせてみましたが、どの場合もonTickは実行され続けていました。
上記の状態から、タイマークラスは、動作し続けていると考えられるので、「tmp_minute」「tmp_second」の値をFragmentの表示部に渡すことができれば、タイマーとして機能するのかと考えています。
説明が不足している部分があれば追記しますので、ご指摘いただけたらありがたいです。
取り急ぎ、タイマークラス全体を補足として追記しました。
いま気づきましたが、タイマークラスの onTick で Fragment を作ってるようですが、駄目です。
Activity 側でも Fragment を作ってると思うので、それに対して処理を行うべきなんですが、その Fragment が作り直されたりするという話をしています。というか、そもそも Fragment を使う必要はあるのでしょうか?
まず、Fragmentの必要性についてですが、結論から言うと必要と判断しています。
情報が後出しで申し訳ありませんが、ナビゲーションドロワーを使用して、別々の機能を持った複数のFragmentに遷移するといった使い方を想定しています。
具体的に言うと
Fragment1:メモ機能+タイマー機能
Fragment2:Fragment1で記録したメモをリスト表示機能
Fragment3:アプリ設定機能
Fragment1でタイマーを作動させている状態で、Fragment2または3に遷移しても、タイマーのカウントを継続させたいと考えています。
タイマークラスでFragment1を作り直してはダメというご指摘ありがとうございます。
以下のように考えていましたが、間違いということでしょうか?
「Fragment mfragment = new Fragment();」でFragment1をインスタンス化
↓
mfragmentからFragment1に配置したタイマー表示部のGUIのidを取得
↓
取得したGUIに対して、値を設定
もしお手数でなければ、どのように修正したら良いかご教示いただけないでしょうか。
回答1件
あなたの回答
tips
プレビュー