嵌套式c#倒计时计时器

本文关键字:计时器 倒计时 嵌套 | 更新日期: 2023-09-27 18:08:22

我想从Xamarin的倒计时中编辑textview,但是它给了我错误

cannot access a nonstatic member of outer type via nested type 

代码

public class myCount : CountDownTimer
{
    public myCount(long millisInFuture, 
                   long countdownIntervall) : base(millisInFuture,countdownIntervall)
    {
    }
    public override void OnFinish ()
    {
        Console.WriteLine ("Done");
    }
    public override void OnTick (long millisUntilFinished)
    {
        countdownText = FindViewById<TextView> (Resource.Id.countdownTimerText);
        countdownText.Text = ("" + millisUntilFinished);
        Console.WriteLine ("test" + millisUntilFinished / 1000);
    }
}        

总之,我如何使用OnTick()访问TextView ?

嵌套式c#倒计时计时器

创建一个静态字符串member,并使用countdownText.Text定期更新其内容

你可以使用一个计时器来调用一个事件,每秒设置countdownText.Text等于member的内容。

您正在尝试在外部作用域中分配countdownText。但是因为你是在那个时候找到视图的,所以你不需要那样做。用这个代替:

TextView ct  = FindViewById<TextView> (Resource.Id.countdownTimerText);
ct.Text = ("" + millisUntilFinished);

在你的更新中,你在构造函数中传递了一个TextView。如果这是你想要更新的TextView,只需将其分配给CountDownTimer类中的成员变量。

myCount是否嵌套在ActivityFragment中?如:

public class MainActivity : Activity
{
    // ...
    public class myCount : CountDownTimer
    {
        // ...
    }  
}

如果是,那么在myCount类范围内调用FindViewById将解析为其所属类(外部类型)中的非静态方法。由于FindViewByIdActivity的实例方法,编译器将对FindViewById的调用解释为调用静态方法并生成错误。编译器基本上是这样解释你的代码:MyActivity.FindViewById<TextView> (Resource.Id.countdownTimerText);myCount的作用域隐藏了这个问题的真正原因。

不能通过嵌套类型 访问外部类型的非静态成员

要修复此错误,在创建myCount计时器对象时传递对所属Activity的引用:

public class MainActivity : Activity
{
    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);
        // Set our view from the "main" layout resource
        SetContentView (Resource.Layout.Main);
        var timer = new myCount (1000, 100, this); // Inject reference to owning Activity.
        timer.Start ();
    }
    public class myCount : CountDownTimer
    {
        Activity m_owner;
        public myCount(long millisInFuture, 
            long countdownIntervall, Activity owner) : base(millisInFuture,countdownIntervall)
        {
            m_owner = owner;
        }
        public override void OnFinish ()
        {
            Console.WriteLine ("Done");
        }
        public override void OnTick (long millisUntilFinished)
        {
            var countdownText = m_owner.FindViewById<TextView> (Resource.Id.countdownTimerText); // Invoke on parent instance.
            countdownText.Text = ("" + millisUntilFinished);
            Console.WriteLine ("test" + millisUntilFinished / 1000);
        }
    }  
}