嵌套式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 ?
创建一个静态字符串member
,并使用countdownText.Text
定期更新其内容
你可以使用一个计时器来调用一个事件,每秒设置countdownText.Text
等于member
的内容。
您正在尝试在外部作用域中分配countdownText
。但是因为你是在那个时候找到视图的,所以你不需要那样做。用这个代替:
TextView ct = FindViewById<TextView> (Resource.Id.countdownTimerText);
ct.Text = ("" + millisUntilFinished);
在你的更新中,你在构造函数中传递了一个TextView。如果这是你想要更新的TextView,只需将其分配给CountDownTimer类中的成员变量。
myCount
是否嵌套在Activity
或Fragment
中?如:
public class MainActivity : Activity
{
// ...
public class myCount : CountDownTimer
{
// ...
}
}
如果是,那么在myCount
类范围内调用FindViewById
将解析为其所属类(外部类型)中的非静态方法。由于FindViewById
是Activity
的实例方法,编译器将对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);
}
}
}