【问题标题】:Xamarin Android Refresh FragmentXamarin Android 刷新片段
【发布时间】:2018-01-13 20:14:47
【问题描述】:

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

我目前正在尝试通过使用 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 答案,有什么方法可以强制“刷新”我当前的片段(视图)?我找到的每个代码都没有被接受。

比如这个sn-p:

// 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();

【问题讨论】:

    标签: android android-fragments xamarin reloading


    【解决方案1】:

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

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

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

    1. 在您的Fragment 中注册BroadcastReceiver

      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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多