【问题标题】:How can i disable a button using a System.Timers.Timer in monodroid?如何在 monodroid 中使用 System.Timers.Timer 禁用按钮?
【发布时间】:2013-08-08 16:00:07
【问题描述】:

我正在使用 monodroid 来制作一个 android 应用程序。我想在 3 秒后禁用视图中的按钮。我正在使用以下代码:

 t = new System.Timers.Timer();
 t.Interval = 3000;
 t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
 t.Start();


 protected void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
 {
    try{
       t.Stop();
       button.Enabled = false;
    catch(){
       Console.WriteLine("Exception: "+ex);       
    }
 }

由于这段代码,我得到以下异常:

 Android.Util.AndroidRuntimeException: Exception of type 'Android.Util.AndroidRuntimeException' was thrown.
 at Android.Runtime.JNIEnv.CallVoidMethod (IntPtr jobject, IntPtr jmethod, Android.Runtime.JValue[] parms) [0x00023] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.8.0-branch/3f1c339b/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:368 
 at Android.Views.View.set_Enabled (Boolean value) [0x00043] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.8.0-branch/3f1c339b/source/monodroid/src/Mono.Android/platforms/android-8/src/generated/Android.Views.View.cs:2341 
 at MyProject.MainActivity.t_Elapsed (System.Object sender, System.Timers.ElapsedEventArgs e) [0x0001e] in /Users/Piscean/Documents/Xamarin Development/MyProject/MyProject/MainActivity.cs:361 
 --- End of managed exception stack trace ---
 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4607)
at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:867)
at android.view.ViewGroup.invalidateChild(ViewGroup.java:4066)
at android.view.View.invalidate(View.java:10193)
at android.widget.TextView.invalidateDrawable(TextView.java:4584)
at android.graphics.drawable.DrawableContainer.invalidateDrawable(DrawableContainer.java:250)
at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:350)
at android.graphics.drawable.Drawable.setVisible(Drawable.java:546)
at android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:307)
at android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:106)
at android.graphics.drawable.Drawable.setState(Drawable.java:462)
at android.view.View.drawableStateChanged(View.java:13998)
at android.widget.TextView.drawableStateChanged(TextView.java:3164)
at android.view.View.refreshDrawableState(View.java:14012)
at android.view.View.setEnabled(View.java:5543)
at android.widget.TextView.setEnabled(TextView.java:1201)
at dalvik.system.NativeStart.run(Native Method)

知道如何在 3 秒后禁用按钮。提前致谢。

【问题讨论】:

    标签: c# xamarin.android xamarin


    【解决方案1】:

    关键是这一行:“只有创建视图层次结构的原始线程才能接触它的视图。”

    由于你的计时器在后台线程上运行,如果你想修改 UI,你需要使用 Activity 的 RunOnUiThread 方法。

     protected void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
     {
        try{
           t.Stop();
           MainActivity.RunOnUiThread(() => { button.Enabled = false; });
        catch(){
           Console.WriteLine("Exception: "+ex);       
        }
     }
    

    【讨论】:

    • 我收到错误消息:“需要对象引用才能访问非静态成员 'Android.App.Activity.RunOnUiThread(System.Action)'”
    • 仅 RunOnUiThread(() => { button.Enabled = false; });完美地工作。谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2017-05-20
    • 2014-06-02
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多