it-swarm.it

Android: come posso visualizzare un orologio di aggiornamento in un TextView

avere un orologio che voglio visualizzare in una TextView.

Avrei pensato che c'erano alcune funzioni di Nizza per farlo, ma non ho trovato nulla. Ho finito per implementare la mia strada che utilizza un Handler. Quello che sto chiedendo però, c'è un modo migliore (più efficiente) per visualizzare un orologio di aggiornamento in tempo reale?

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

Questo è il mio gestore, che viene eseguito ogni secondo, quindi la funzione di data e ora impostata è inferiore

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

Saluti

16
Richard Rout

Ricorda: l'ottimizzazione prematura è la radice di tutto il male. Quindi ottimizza solo quando sei sicuro (= lo hai misurato) che la tua implementazione è lenta/inefficiente.

Detto questo, un metodo più efficiente sarebbe probabilmente quello di registrare l'ora di inizio tramite System.currentTimeMillis() e quindi controllarlo periodicamente e calcolare la differenza in minuti. 

2
Peter Knego

L'aggiornamento dell'orologio di sistema non è come aggiornare un cronometro. Parliamo del tempo cambiato al minuto (orologio del sistema minuto e 00 secondi).

Utilizzare un timer non è il modo giusto per farlo. Non è solo eccessivo, ma è necessario ricorrere a qualche trucco per farlo bene.

Il modo giusto per fare ciò (ad esempio aggiornare una TextView che mostra l'ora come HH: mm) è usare BroadcastReceiver in questo modo:

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

Il sistema invierà questo evento di trasmissione all'inizio esatto di ogni minuto in base all'orologio di sistema. Non dimenticare, comunque, di inizializzare la tua TextView in anticipo (al momento attuale del sistema) poiché è probabile che tu inserisca l'interfaccia utente nel giro di un minuto e TextView non verrà aggiornato fino a quando non si verifica il minuto successivo.

37
Alex

Controlla le classi Chronometer e DigitalClock , che sono estensioni della classe TextView. Dovrebbero fare automaticamente ciò che stai cercando. Se hai bisogno di alcune funzionalità aggiuntive, basta dare un'occhiata al codice sorgente per quelle e apportare le modifiche necessarie.

AGGIORNARE:

Dato che l'orologio digitale è obsoleto in API 17, raccomanderei di usare Text Clock invece.

15
Joe Krill

Raccomando TextClock (dall'API 17), inoltre, non utilizzare DigitalClock (Deprecato dall'API 17) poiché causerebbe MEMORY LEAK e porterà a Eccezione di memoria insufficiente. Aggiungi il seguente pezzo di codice al layout corrispondente file .xml

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

Questo farà il trucco, inoltre ti preghiamo di notare che è possibile formattare il tempo di visualizzazione come richiesto, ad esempio per ottenere il formato 12 ore con secondi, puoi usare "Android: format12Hour =" hh: mm: ss a "".

3
Sreerag S Kumar

Puoi utilizzare il widget TextClock fornito da Android

<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" />

richiede un minimo di API 17

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

se si desidera l'ora corrente in un'altra vista di testo 

puoi utilizzare lo snippet di codice seguente

 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());
            }
        });
    }
0
MarGin

Il widget DigitalClock è disponibile in Android api 1 o usa il widget TextClock in api 17

crea il layout per l'orologio come questo:

<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>       

in Activity aggiungi listener textchage a DigitalClock è una sottoclasse di textview in modo che possiamo aggiungere textchangedkistener per ottenere l'ora aggiornata e impostare l'ora nella tua vista testo come vuoi

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