0

我已经在官方论坛上问过这个问题,但还没有收到答案。

我目前正在尝试通过使用 Xamarin Android 的智能手机控制多个设备(灯、百叶窗、门、车库)来实现我的“智能家居”项目。我用 UDP 数据包控制我的设备。

我现在尝试从我的 Arduino 接收 UDP 数据包,以检查设备(例如灯)是打开还是关闭。为此,我使用了一个 Udplistener:

class UdpListener
        {
            private readonly UdpClient _udpClient = new UdpClient(4210);

            public async void StartListening()
            {
                while (true)
                {
                    var result = await _udpClient.ReceiveAsync();
                    var message = Encoding.ASCII.GetString(result.Buffer);

                    if (message.Contains("1"))
                    {
                        Licht.GlobalVariables.lampe1 = "1";
                    }
                    else
                    {
                        Licht.GlobalVariables.lampe1 = "0";
                    }
                }

            }

          }

当我收到正确答案时,我将指示器设置为可见(在 onCreateView 中),这样我就可以在应用程序中看到灯是否打开/关闭。但这是我遇到的问题:仅当我重新加载片段时指示器才可见(这是有道理的,因为接收 UDP 数据包需要一些时间)。

一旦我收到 UDP 答案,有什么方法可以强制“刷新”我当前的片段(视图)?我发现的每个代码都没有被接受。

例如这个片段:

// Reload current fragment
Fragment frg = null;
frg = getSupportFragmentManager().findFragmentByTag("Your_Fragment_TAG");
final FragmentTransaction ft = 
getSupportFragmentManager().beginTransaction();
ft.detach(frg);
ft.attach(frg);
ft.commit();
4

1 回答 1

1

一旦我收到 UDP 答案,有什么方法可以强制“刷新”我当前的片段(视图)?

UI片段在方法上重建它onCreateView(),并且在创建或重新创建片段时发生。

您必须实现自己的 updateUI 方法,或者在哪里指定哪些元素以及它们应该如何更新。你可以BroadcastReceiver在你的Fragement.

  1. BroadcastReceiver在你的注册一个Fragment

    MyBroadcastReceiver mBroadcastReceiver = new MyBroadcastReceiver();
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.AddAction("com.test.demo");
    context.RegisterReceiver(mBroadcastReceiver, intentFilter);
    
  2. 收到UDP答案后,您可以发送BroadcastReceiver

    Intent intent = new Intent();
    intent.SetAction("com.test.lizi");
    intent.PutExtra("name", "ET");
    context.SendBroadcast(intent);
    
  3. 更新您的Fragment

    public class MyBroadcastReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            updateUI(intent);  //calling function     
        }
    }
    

如果这还不够,你可以做一些事情,比如用相同的片段替换片段,强制它调用onCreateView()这样的方法:

FragmentTransaction ft = this.FragmentManager.BeginTransaction();
ft.Replace(Resource.Id.your_fragment_container, yourFragmentInstance);
ft.Commit();
于 2017-08-07T23:16:25.793 回答