java Android:DigitalClock 删除秒

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7610549/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 20:41:05  来源:igfitidea点击:

Android: DigitalClock remove seconds

javaandroidclockdigital

提问by Lorenzo Sciuto

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!

问题是它也显示了几秒钟……有一种简单快捷的方法可以隐藏那些吗?我只需要 hh:mm 格式的小时和分钟,而不是 hh:mm:ss!有什么建议?谢谢!

回答by IanTeda

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

这里找到答案,对于其他正在寻找有效答案的人,这里是:

  1. Clone/copy DigitalClock.javafrom 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);
    
  1. DigitalClock.java从安卓源克隆/复制
  2. 在 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. 在布局 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);
    

回答by Jason Plank

The DigitalClock Javadocstates:

DigitalClock的Javadoc状态:

Class Overview

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

课程概览

像模拟时钟,但数字。显示秒。FIXME:实现小时/分钟/秒的单独视图,因此比例字体不会影响渲染

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.

根据 判断FIXME,隐藏部分 DigitalClock 的功能可能最终会实现。我目前在 Javadoc 或源代码中没有找到任何可以执行您想要的操作的内容。

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.

除非您想编写自己的类来扩展 DigitalClock(或您自己的时钟实现),否则您可以只用另一个元素覆盖 DigitalClock 的秒部分,如果它可以满足您的目的。