xamarin 更新标签被更改为不同的活动而被杀死
Posted
技术标签:
【中文标题】xamarin 更新标签被更改为不同的活动而被杀死【英文标题】:xamarin update label been killed by change to a different activity 【发布时间】:2020-10-22 10:54:34 【问题描述】:我们有一个非常简单的应用程序,它通过蓝牙连接读取数据并更新页面上的文本字符串。所有更新都通过计时器正常工作,但是当我们切换到应用程序中的其他页面并返回主页时,更新停止工作。我们可以在文本字符串更新上设置一个断点,我们可以看到新值但它没有更新。
为什么当我们切换到不同的页面并返回时,它会停止更新?这是一个简单的标签,它在 UI 中已更新?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Plugin.BLE;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace Custom_TestAppHarness
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class Homepage : ContentPage, INotifyPropertyChanged
public Homepage()
InitializeComponent();
// Start timer to update all the information on the home activity
if (App._timeerhasstarted == false)
App._timeerhasstarted = true;
Device.StartTimer(TimeSpan.FromSeconds(5), () =>
Task.Run(() =>
testcall();
);
return true; //use this to run continuously
);
void testcall()
Device.BeginInvokeOnMainThread(async () =>
BTTextStatus.Text = App._vehiclefuellevel.ToString();
);
protected override void OnAppearing()
base.OnAppearing();
BTTextStatus.Text = App._vehiclefuellevel.ToString();
标签的 XML 代码
<Label
x:Name = "BTTextStatus"
Grid.Row="2"
Grid.Column="0"
Grid.ColumnSpan="6"
HorizontalOptions="CenterAndExpand"
VerticalOptions="CenterAndExpand"
TextColor="#cccccc"
FontSize="Medium"/>
【问题讨论】:
change to a different activity
您的意思是导航到其他页面吗?什么时候回到Homepage
Label
这个内容不能改吗?我用你的代码写了一个演示,它可以正常工作(我在page1中更改了主页的内容),这里是运行GIF。 imgur.com/a/2PAEt6j
是的,当我们切换到不同的页面时,我们无法更新标签,即加载应用程序,出现主屏幕,读取 BT 数据,我们可以使用计时器更新标签。但是当我们切换到不同的页面然后返回主页时,我们无法更新标签。非常感谢您测试我的代码,奇怪的是它完全可以在您的演示中运行。这真的很奇怪,但在切换到其他页面时它会停止工作。
你可以创建一个静态数据,然后在其他页面更新`App._vehiclefuellevel.`,如果成功了?
【参考方案1】:
解决方法是从 xaml 中移动组件并将它们添加到 .cs 文件中,以便在页面重新加载时再次引用这些组件。这是标签组件的示例,您需要在 xaml 网格布局中添加引用。
MainGrid.Children.Add(lblText = new Label()
TextColor = Color.FromHex("#cccccc"),
FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label)),
HorizontalOptions = LayoutOptions.CenterAndExpand,
VerticalOptions = LayoutOptions.CenterAndExpand,
, 0, 2);
Grid.SetColumnSpan(lblText, 6);
在 xaml 代码中添加 x:name 引用,以便在我们重新加载页面时插入组件
<Grid x:Name="MainGrid" HorizontalOptions="CenterAndExpand" RowSpacing="0" ColumnSpacing="0">
【讨论】:
以上是关于xamarin 更新标签被更改为不同的活动而被杀死的主要内容,如果未能解决你的问题,请参考以下文章
如何将标签更改为与在 Xamarin 表单上显示通知相同的布局?
如果 Activity 被销毁,我可以从 Activity 调用静态方法吗?
容器因超出内存限制而被 YARN 杀死。使用了 14.8 GB 的 6 GB 物理内存