Android: DigitalClock remove seconds
Asked Answered
H

2

7

I used this code for adding a clock to my app:

  <DigitalClock 
android:id="@+id/digitalclock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:textSize = "30sp"
/>

The problem is that it shows also seconds..there is a simple and fast way for hide those? I need just hours and minutes in hh:mm format instead of hh:mm:ss! any suggestions? Thanks!

Hamitic answered 30/9, 2011 at 12:45 Comment(0)
A
28

Found the answer here, for anyone else looking for a working answer, here it is:

  1. Clone/copy DigitalClock.java from android source
  2. Change format strings within new CustomDigitalClock

    package com.example;
    
    import android.content.Context;
    import android.content.res.Resources;
    import android.database.ContentObserver;
    import android.os.Handler;
    import android.os.SystemClock;
    import android.provider.Settings;
    import android.text.format.DateFormat;
    import android.util.AttributeSet;
    import android.widget.TextView;
    
    import java.util.Calendar;
    
    /**
     * You have to make a clone of the file DigitalClock.java to use in your application, modify in the following manner:-
     *      private final static String m12 = "h:mm aa";
     *      private final static String m24 = "k:mm";
     */
    
    public class CustomDigitalClock extends TextView {
    
        Calendar mCalendar;
        private final static String m12 = "h:mm aa";
        private final static String m24 = "k:mm";
        private FormatChangeObserver mFormatChangeObserver;
    
        private Runnable mTicker;
        private Handler mHandler;
    
        private boolean mTickerStopped = false;
    
        String mFormat;
    
        public CustomDigitalClock(Context context) {
            super(context);
            initClock(context);
        }
    
        public CustomDigitalClock(Context context, AttributeSet attrs) {
            super(context, attrs);
            initClock(context);
        }
    
        private void initClock(Context context) {
            Resources r = context.getResources();
    
            if (mCalendar == null) {
                mCalendar = Calendar.getInstance();
            }
    
            mFormatChangeObserver = new FormatChangeObserver();
            getContext().getContentResolver().registerContentObserver(
                    Settings.System.CONTENT_URI, true, mFormatChangeObserver);
    
            setFormat();
        }
    
        @Override
        protected void onAttachedToWindow() {
            mTickerStopped = false;
            super.onAttachedToWindow();
            mHandler = new Handler();
    
            /**
             * requests a tick on the next hard-second boundary
             */
            mTicker = new Runnable() {
                    public void run() {
                        if (mTickerStopped) return;
                        mCalendar.setTimeInMillis(System.currentTimeMillis());
                        setText(DateFormat.format(mFormat, mCalendar));
                        invalidate();
                        long now = SystemClock.uptimeMillis();
                        long next = now + (1000 - now % 1000);
                        mHandler.postAtTime(mTicker, next);
                    }
                };
            mTicker.run();
        }
    
        @Override
        protected void onDetachedFromWindow() {
            super.onDetachedFromWindow();
            mTickerStopped = true;
        }
    
        /**
         * Pulls 12/24 mode from system settings
         */
        private boolean get24HourMode() {
            return android.text.format.DateFormat.is24HourFormat(getContext());
        }
    
        private void setFormat() {
            if (get24HourMode()) {
                mFormat = m24;
            } else {
                mFormat = m12;
            }
        }
    
        private class FormatChangeObserver extends ContentObserver {
            public FormatChangeObserver() {
                super(new Handler());
            }
    
            @Override
            public void onChange(boolean selfChange) {
                setFormat();
            }
        }
    
    }
    
  3. Reference custom class within in layout xml

    <com.example.CustomDigitalClock
        android:id="@+id/fragment_clock_digital"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="DigitalClock" />
    
  4. Load CustomDigitalClock within activity/fragment

    CustomDigitalClock dc = (CustomDigitalClock)
    mFragmentView.findViewById(R.id.fragment_clock_digital);
    
Anathema answered 23/1, 2013 at 4:25 Comment(2)
Works great! Only you can remove row: Resources r = context.getResources(); It is not used anywhere.Embower
Calling registerContentObserver without unregistering will cause memory leaks. I found that everytime an activity with this clock in it was closed by the OS, the activity was retained in the heap.Billyebilobate
I
2

The DigitalClock Javadoc states:

Class Overview

Like AnalogClock, but digital. Shows seconds. FIXME: implement separate views for hours/minutes/seconds, so proportional fonts don't shake rendering

Judging by the FIXME, the ability to hide portions of DigitalClock might be implemented eventually. I didn't find anything currently in the Javadoc or source code that would do what you want it to.

Unless you want to write your own class that extends DigitalClock (or your own clock implementation altogether), you could just cover the seconds portion of the DigitalClock with another element if it would serve your purpose.

Idolla answered 10/11, 2011 at 14:51 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.