如何在 Xamarin.Android 中使用 CountDownTimer class 设置、重置计时器

How to set ,reset a timer using CountDownTimer class in Xamarin.Android

我为另一个项目制作了一个简单的 Countdowntimer 应用程序,我尽力 运行 这个简单的计时器来启动、暂停和重置 timer.My 第一个问题是, 由于 MainActivity 不能继承多个 classes 我不得不创建一个新的,这样我就可以继承抽象的 class CountDownTimer,其次我不完全知道我能够从调用 CountDownTimer 构造函数abstract class 因为我不能初始化一个 abstract class 只能在 subclass 构造函数中调用它。此外,我不明白如何将它与我的 UI.I' 连接起来我完全迷失了,谁能帮我解决这个问题?? .我还在 github

上发布了代码

GitHub : https://github.com/owais19m/TimerApp_Test

谢谢,

Blockquote

 using Android.App; 
 using Android.OS;
 using Android.Support.V7.App;
 using Android.Runtime;
 using Android.Widget;
 using Android.Content;
 using Android.Telephony;
 using Android.Provider;
 using Android.Util;
 using Java.Lang;
 using System.Text.RegularExpressions;
 using Xamarin.Essentials;
 using System;
 using Android;
 using Android.Support.V4.Content;
 using Android.Content.PM;
 namespace TimerApp_Test
 {
     [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
     public class MainActivity : AppCompatActivity
     {
         private static System.Boolean mTimerRunning;
     protected override void OnCreate(Bundle savedInstanceState)
     {
         base.OnCreate(savedInstanceState);
         Xamarin.Essentials.Platform.Init(this, savedInstanceState);
         // Set our view from the "main" layout resource
         SetContentView(Resource.Layout.activity_main);
         //------------ Views -------------
         Button ResetBtn = FindViewById<Button>(Resource.Id.ResetButton);
         Button StartBtn = FindViewById<Button>(Resource.Id.StartButton);
         TextView TimerText = FindViewById<TextView>(Resource.Id.CountdownText);
         //--------------------------------
         StartBtn.Click += (s, e) =>
         {
                
              if (mTimerRunning)
             {
                 pauseTimer();
             }
             else
             {
                 startTimer();
             }
                 
         };
         ResetBtn.Click += (s, e) =>
         {
             resetTimer();
         };
     }
     public void startTimer()
     {
         CountDown1 Coutdwn = new CountDown1(6000,1000);
         Coutdwn.OnTick(1000);
            
         Coutdwn.Start();
         mTimerRunning = true;   
                
            
     }
       
     public void resetTimer()
     {
     }
     public void pauseTimer()
     {
             
     }
     public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
     {
         Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
         base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
     }
       
 }
 public class CountDown1 : CountDownTimer
 {
     public static long Start_Time_Milliseconds = 600000;
     public static CountDownTimer mcountDownTimer;
        
     public static long mTimeLeftInMillis = Start_Time_Milliseconds;
     public CountDown1(long mTimeLeftInMilli, long countDownInterva) : base(mTimeLeftInMilli,countDownInterva)
     { 
     }
     public override void OnFinish() { }
           
        
     public override void OnTick(long millisUntilFinished)
     {
         mTimeLeftInMillis = millisUntilFinished;
         updateCountDownText();
 
     }
     public string updateCountDownText()
     {
         int minutes = (int)mTimeLeftInMillis / 1000 / 60;
         int seconds = (int)mTimeLeftInMillis / 1000 % 60;
         string timeLeftFormatted = string.Format("%02d:%02d", minutes, seconds);
         return timeLeftFormatted; 
     }
     public void Cancellation()
     {
         mcountDownTimer.Cancel();
     }
 }

 }

Blockquote

您可以将要显示时间的 TextView 作为参数传递到您的自定义 CountDownTimer 中,如下所示:

[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
   CountDown1 Coutdwn;
   protected override void OnCreate(Bundle savedInstanceState)
   {
     base.OnCreate(savedInstanceState);
     Xamarin.Essentials.Platform.Init(this, savedInstanceState);
     // Set our view from the "main" layout resource
     SetContentView(Resource.Layout.activity_main);
     //------------ Views -------------
     Button ResetBtn = FindViewById<Button>(Resource.Id.ResetButton);
     Button StartBtn = FindViewById<Button>(Resource.Id.StartButton);
     TextView TimerText = FindViewById<TextView>(Resource.Id.CountdownText);
     Coutdwn = new CountDown1(60000, 1000, TimerText);
     //--------------------------------
     StartBtn.Click += (s, e) =>
     {
        startTimer();
             
     };
     ResetBtn.Click += (s, e) =>
     {
         resetTimer();
     };
   }
   public void startTimer()
   {
      Coutdwn.Start();                                  
   }
   
   public void resetTimer()
   {
      myTimer.Cancel();
      myTimer.Start();
   }
   public void pauseTimer()
   {
      myTimer.Cancel();    
   }
   public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
   { 
     Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
     base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
   }
   
}
public class CountDown1 : CountDownTimer
{    
  TextView timeTextView;    
  public CountDown1(long mTimeLeftInMilli, long countDownInterva,TextView textView) : base(mTimeLeftInMilli,countDownInterva)
  { 
    timeTextView = textView;
  }
  public override void OnFinish() { }
       
    
  public override void OnTick(long millisUntilFinished)
  {
     mTimeLeftInMillis = millisUntilFinished;
     updateCountDownText();

  }
  public void updateCountDownText()
  {
     int minutes = (int)mTimeLeftInMillis / 1000 / 60;
     int seconds = (int)mTimeLeftInMillis / 1000 % 60;
     string timeLeftFormatted = string.Format("%02d:%02d", minutes, seconds);
     timeTextView.Text = timeLeftFormatted; 
  }
}

谢谢,效果很好,就此而言,我编写了一个简单的通知程序,当我的计时器在 CountDown1 class 的 OnFinished() 方法中停止时,我得到一个“Java.Lang.IllegalStateException:'System services not available to Activities before onCreate()'“错误,有解决办法吗?

public NotificationCompat.Builder builder;
     MainActivity activity = new MainActivity();
     NotificationManagerCompat notificationManager;
     public override void OnFinish() 
     { 
         Toast.MakeText(Application.Context ,"Finished",ToastLength.Short).Show();
          builder = new NotificationCompat.Builder(this.activity, CHANNEL_ID).SetAutoCancel(true)
        .SetContentTitle("CountDownTimer !!")
        .SetSmallIcon(Resource.Drawable.abc_ic_star_black_48dp)
        .SetContentText($" Stopped"); //  display.
          notificationManager = NotificationManagerCompat.From(this.activity);   Error  //  Java.Lang.IllegalStateException: 'System services not available to Activities...
         notificationManager.Notify(NOTIFICATION_ID, builder.Build());
     }