2017-08-06 75 views
0

我在官方论坛上已经提出这个问题,但是还没有收到答案。Xamarin Android刷新片段

目前,我想要实现我的“智能家居”项目,通过控制多台设备(光,百叶窗,门,车库)使用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(); 

回答

1

有没有办法强制“刷新”我的当前片段(视图)一旦我收到UDP回答?

片段重建它的UIonCreateView()方法,并创建或重新创建所述片段时发生这种情况。

你必须实现自己的updateUI方法或在那里你会指定应更新哪些要素,以及如何。您可以在您的Fragement中使用注册BroadcastReceiver

  1. 注册一个BroadcastReceiverFragment

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

@Peter潘,你解决问题了吗? –