web-dev-qa-db-ja.com

Android:TextViewで更新時計を表示するには

textViewに表示したい時計があります。

これを行うにはいくつかの素敵な関数があると思っていたでしょうが、何も見つかりませんでした。ハンドラーを使用する独自の方法を実装することになりました。私が尋ねていることは、リアルタイムの更新時計を表示するためのより良い(より効率的な)方法はありますか?

private Runnable mUpdateClockTask = new Runnable() {
   public void run() {
       setTime();
       mClockHandler.postDelayed(this, 1000);
   }
};

それは毎秒実行される私のハンドラーであり、次に私の設定された日時関数は以下です

TextView mClockView;

public void setTime() {
    Calendar cal = Calendar.getInstance();
    int minutes = cal.get(Calendar.MINUTE);

    if (DateFormat.is24HourFormat(this)) {
        int hours = cal.get(Calendar.HOUR_OF_DAY);
        mClockView.setText((hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes));
    }
    else {
        int hours = cal.get(Calendar.HOUR);
        mClockView.setText(hours + ":" + (minutes < 10 ? "0" + minutes : minutes) + " " + new DateFormatSymbols().getAmPmStrings()[cal.get(Calendar.AM_PM)]);
    }
}

乾杯

19
Richard Rout

覚えておいてください:時期尚早な最適化はすべての悪の根源です。したがって、最適化は、実装が遅い/非効率的であると確信している(=測定した)場合にのみ最適化してください。

とはいえ、より効率的な方法は、おそらくSystem.currentTimeMillis()を使用して開始時間を記録し、定期的にそれをチェックして差を分単位で計算することです。

2
Peter Knego

システムクロックの更新は、クロノメーターの更新とは異なります。変更された時間について話します(システムクロックの分と00秒)。

タイマーの使用は、これを行うための正しい方法ではありません。それはやり過ぎであるだけでなく、正しくするためにいくつかのトリックに頼らなければなりません。

これを行う正しい方法(つまり、時刻をHH:mmとして表示するTextViewを更新する)は、次のようにBroadcastReceiverを使用することです。

BroadcastReceiver _broadcastReceiver;
private final SimpleDateFormat _sdfWatchTime = new SimpleDateFormat("HH:mm");
private TextView _tvTime;

@Override
public void onStart() {
    super.onStart();
    _broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context ctx, Intent intent) {
                if (intent.getAction().compareTo(Intent.ACTION_TIME_TICK) == 0)
                    _tvTime.setText(_sdfWatchTime.format(new Date()));
            }
        };

    registerReceiver(_broadcastReceiver, new IntentFilter(Intent.ACTION_TIME_TICK));
}

@Override
public void onStop() {
    super.onStop();
    if (_broadcastReceiver != null)
        unregisterReceiver(_broadcastReceiver);
}

システムは、システムクロックに基づいて、毎分の正確な開始時にこのブロードキャストイベントを送信します。ただし、TextViewを事前に(現在のシステム時刻に)初期化することを忘れないでください。1分以内にUIがポップされ、TextViewは次の分が発生するまで更新されない可能性があります。

40
Alex

TextViewクラスの拡張である Chronometer および DigitalClock クラスを確認してください。彼らはあなたが探していることを自動的に行うはずです。追加の機能が必要な場合は、それらのソースコードを見て、必要な変更を加えてください。

更新:

API 17ではデジタル時計が廃止されているため、代わりに Text Clock を使用することをお勧めします。

15
Joe Krill

TextClock(API 17以降)をお勧めします。また、DigitalClock(API 17から非推奨)を使用しないでください。メモリリークが発生し、メモリ不足例外が発生します。次のコードを対応するlayout.xmlファイルに追加してください

 <TextClock
   Android:id="@+id/textClock1"
   Android:layout_width="fill_parent"
   Android:layout_height="wrap_content"
   Android:gravity="center_horizontal"
   Android:textColor="#17d409" />

これでうまくいきます。たとえば、「Android:format12Hour = "hh:mm:ss a"」を使用して、12時間形式で秒を取得する場合など、必要に応じて表示時間をフォーマットできます。

4
Sreerag S Kumar

Androidが提供するTextClockウィジェットを使用できます。

<TextClock
    Android:id="@+id/textClock"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:format12Hour="hh:mm:ss a"
    Android:gravity="center_horizontal"
    Android:textColor="#d41709"
    Android:textSize="20sp"
    Android:textStyle="bold" />

最低APIレベル17が必要です

https://developer.Android.com/reference/Android/widget/TextClock

別のテキストビューで現在の時刻が必要な場合

以下のコードスニペットを使用できます

 tClock = (TextClock) findViewById(R.id.textClock1);
        tView = (TextView) findViewById(R.id.textview1);
        btn = (Button)findViewById(R.id.btnGet);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tView.setText("Time: "+tClock.getText());
            }
        });
    }
1
MarGin

DigitalClockウィジェットはAndroid api 1で利用可能です。またはAPI 17でTextClockウィジェットを使用します

最初に次のような時計のレイアウトを作成します。

<LinearLayout 
         Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:orientation="vertical"
    >
    <TextView Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:id="@+id/clocktext"
        Android:textStyle="bold"
        Android:textColor="#ffffff"
        Android:layout_marginTop="30dp"
        Android:textSize="50sp"
        Android:text="2:46"/>
    <DigitalClock Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:id="@+id/clock"
        Android:textStyle="bold"
        Android:textSize="50sp"
        Android:visibility="gone"
        Android:textColor="#ffffff"
        />  
    </LinearLayout>       

アクティビティで、textchageリスナーをDigitalClockのテキストビューのサブクラスに追加します。したがって、textchangedkistenerを追加して、更新された時間を取得し、必要に応じてテキストビューに時間を設定できます。

chagre = (TextView) mTopView.findViewById(R.id.clocktext);// TextView to display Time
    clock = (DigitalClock) mTopView.findViewById(R.id.clock);// DigitalClock With visibility=gone

    clock.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {}

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {}
        @Override
        public void afterTextChanged(Editable s) {

            chagre.setText(s.toString());//will be called when system clock updataes

        }
    });
0
Jitty Aandyan