2017-08-06 79 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潘,你解決問題了嗎? –