Android: DigitalClock удаляет секунды - PullRequest
7 голосов
/ 30 сентября 2011

Я использовал этот код для добавления часов в свое приложение:

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

Проблема в том, что он показывает также секунды. Есть простой и быстрый способ скрыть их? Мне нужны часы и минуты в формате чч: мм вместо чч: мм: сс! какие-либо предложения? Спасибо!

Ответы [ 2 ]

28 голосов
/ 23 января 2013

Найден ответ здесь , для всех, кто ищет рабочий ответ, вот он:

  1. Клонирование / копирование DigitalClock.java из источника Android
  2. Изменение строк формата в новых 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. Ссылка на пользовательский класс в макете xml

    <com.example.CustomDigitalClock
        android:id="@+id/fragment_clock_digital"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="DigitalClock" />
    
  4. ЗагрузитьCustomDigitalClock внутри действия / фрагмент

    CustomDigitalClock dc = (CustomDigitalClock)
    mFragmentView.findViewById(R.id.fragment_clock_digital);
    
2 голосов
/ 10 ноября 2011

Javadoc DigitalClock сообщает:

Обзор класса

Как и AnalogClock, но цифровой.Показывает секунды.ИСПРАВЛЕНИЕ: реализуйте отдельные представления для часов / минут / секунд, чтобы пропорциональные шрифты не шевелились при рендеринге

Судя по FIXME, возможность со временем скрыть части DigitalClock может быть реализована.Я не нашел ничего в настоящее время в Javadoc или исходном коде, который бы делал то, что вы хотите.

Если вы не хотите писать свой собственный класс, который расширяет DigitalClock (или вашу собственную реализацию часов вообще), вы могли быпросто закройте секундную часть DigitalClock другим элементом, если он будет соответствовать вашим целям.

...