【问题标题】:How to set ,reset a timer using CountDownTimer class in Xamarin.Android如何在 Xamarin.Android 中使用 CountDownTimer 类设置、重置计时器
【发布时间】:2021-03-04 18:36:38
【问题描述】:

我为另一个项目制作了一个简单的 Countdowntimer 应用程序,我尽力运行这个简单的计时器来启动、暂停和重置计时器。我的第一个问题是, 由于 MainActivity 不能继承多个类,我必须创建一个新类,以便继承抽象类 CountDownTimer,其次,我不完全知道我是否能够从抽象类调用 CountDownTimer 构造函数,因为我无法初始化抽象类只能在子类构造函数中调用它。另外,我不明白如何将它与我的 UI 连接起来。我完全迷失了,有人可以帮我吗? .我也在github上发布了代码

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

谢谢,

块引用

 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();
     }
 }

 }

块引用

【问题讨论】:

    标签: c# .net xamarin xamarin.android


    【解决方案1】:

    您可以将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; 
      }
    }
    

    【讨论】:

      【解决方案2】:

      谢谢,这很好,就这一点而言,当我的计时器在 CountDown1 类的 OnFinished() 方法中停止时,我编写了一个简单的通知程序,我得到一个“Java.Lang.IllegalStateException:'系统服务不可用于活动在 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());
           }
      

      【讨论】:

      • 有人可以帮我解决这个问题吗?
      猜你喜欢
      • 1970-01-01
      • 2016-01-09
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 2021-09-22
      • 2011-06-03
      相关资源
      最近更新 更多