带有Timer的Xamarin Android UI不会对变化做出反应

时间:2016-01-04 21:33:48

标签: c# android timer xamarin xamarin-studio

我正在使用Xamarin Studio,我建立的应用程序应该轮流切换左右列(如警灯)。为此,我使用了计时器和断点,我可以看到代码运行ColorFlip并且正在设置值但是我看不到模拟器UI中的任何更改。

main.xml中

<?xml version="1.0" encoding="utf-8"?>       
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TableLayout
        android:id="@+id/LightSignal"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"
        android:layout_marginTop="23dp"
        android:stretchColumns="*" >

        <TableRow
            android:id="@+id/tableRow1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:weightSum="1" >

            <TextView
                android:id="@+id/Left"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:paddingLeft="8dp"
                android:textColor="#FFF000"
                android:background = "#000000"
                android:layout_column="0"
                />

            <TextView
                android:id="@+id/Right"
                android:paddingLeft="4dp"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:textColor="#FFF000"
                android:background = "#000000"
                android:layout_column="1"
                />
        </TableRow>
    </TableLayout>

</LinearLayout>

MainActivity.cs

using System;

using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using System.Collections.Generic;
using Android.Graphics;

namespace Core.Droid
{
    [Activity (Label = "Core.Droid", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
    {

        bool IsRed; 
        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);

            global::Xamarin.Forms.Forms.Init (this, bundle);
            var app = new App ();
            LoadApplication(app);
            this.SetContentView(Resource.Layout.Main);

            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Interval = 1000; 
            timer.Elapsed += ColorFlip;
            timer.Enabled = true;

        }

        private void ColorFlip(object sender, System.Timers.ElapsedEventArgs e)
        {
            var left = FindViewById<TextView> (Resource.Id.Left);
            var right = FindViewById<TextView> (Resource.Id.Right);

            if (IsRed) {
                left.SetBackgroundColor (Color.Black);
                right.SetBackgroundColor (Color.Blue);
                IsRed = false;
            }else {
                left.SetBackgroundColor (Color.Red);
                right.SetBackgroundColor (Color.Black);
                IsRed = true;
            }
        }
    }
}

我假设我需要在更改颜色后强制更新UI,我该如何解决?

1 个答案:

答案 0 :(得分:2)

使用RunOnUiThread

private void ColorFlip(object sender, System.Timers.ElapsedEventArgs e)
{
    RunOnUiThread (() => {
        var left = FindViewById<TextView> (Resource.Id.Left);
        var right = FindViewById<TextView> (Resource.Id.Right);

        if (IsRed) {
            left.SetBackgroundColor (Color.Black);
            right.SetBackgroundColor (Color.Blue);
            IsRed = false;
        } else {
            left.SetBackgroundColor (Color.Red);
            right.SetBackgroundColor (Color.Black);
            IsRed = true;
        }
    });
}