【问题标题】:Android: DigitalClock remove secondsAndroid:DigitalClock 删除秒
【发布时间】:2011-11-28 11:03:28
【问题描述】:

我使用此代码向我的应用添加时钟:

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

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

【问题讨论】:

    标签: java android clock digital


    【解决方案1】:

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

    1. 从安卓源克隆/复制DigitalClock.java
    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);
      

    【讨论】:

    • 效果很好!只有你可以删除行:Resources r = context.getResources();它不在任何地方使用。
    • 不注销就调用 registerContentObserver 会导致内存泄漏。我发现每次操作系统关闭带有此时钟的活动时,该活动都会保留在堆中。
    【解决方案2】:

    DigitalClock Javadoc 声明:

    类概述

    类似于 AnalogClock,但是是数字的。显示秒。 FIXME:实施 小时/分钟/秒的单独视图,因此比例字体不会 抖动渲染

    FIXME 来看,隐藏部分 DigitalClock 的能力最终可能会实现。我目前在 Javadoc 或源代码中没有找到任何可以做你想做的事情。

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

    【讨论】:

      猜你喜欢
      • 2015-10-21
      • 2011-07-03
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 2017-01-04
      • 1970-01-01
      • 2011-02-15
      相关资源
      最近更新 更多