Как установить, сбросить таймер с помощью класса CountDownTimer в Xamarin.Android

#c# #.net #xamarin #xamarin.android

#c# #.net #xamarin #xamarin.android

Вопрос:

Я сделал простое приложение Countdowntimer для другого проекта, я изо всех сил старался запустить этот простой таймер для запуска, приостановки и сброса таймера.Моя первая проблема заключалась в том, что, поскольку MainActivity не может наследовать несколько классов, мне пришлось создать новый, чтобы я мог наследовать абстрактный класс CountDownTimer , во-вторых, я не совсем уверен, что смог вызвать конструктор CountDownTimer из абстрактного класса, потому что я не могу инициализировать абстрактный класс, вызывающий толькоон формируется внутри конструктора подкласса.Кроме того, я не понимаю, как мне подключить его к своему пользовательскому интерфейсу.Я полностью запутался в этом, кто-нибудь может мне помочь в этом?? .Я также опубликовал код на 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("d:d", minutes, seconds);
         return timeLeftFormatted; 
     }
     public void Cancellation()
     {
         mcountDownTimer.Cancel();
     }
 }

 }
 

Blockquote

Ответ №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("d:d", minutes, seconds);
     timeTextView.Text = timeLeftFormatted; 
  }
}
 

Ответ №2:

Спасибо, это отлично сработало, просто в связи с этим я закодировал простую программу уведомлений, когда мой таймер останавливается в методе onFinished() в классе CountDown1, я получаю «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());
     }
 

Комментарии:

1. Может кто-нибудь, пожалуйста, помочь мне в этой части?