2016-10-04 29 views
0

我有一個名爲Session的活動,它顯示了不同的表格,當單擊每個表格的按鈕時,應該顯示Seats,但它們只顯示在第一個表格上。只能正確繪製第一個片段

會話包含Table Fragments的列表,每個表包含Seat Fragments的列表。

[Activity] Session 
    [List<TableFragment>] Tables 
     [List<SeatFragment>] Seats 

所有表上的預期結果: enter image description here

它的外觀上的所有表,除了在第一個表: enter image description here

此外,當我進入Session活動創建一個空表與「表名」和「座位」與Seat Fragment這是奇怪的名稱設置。 「表格名稱」是一個從佈局文件中取得的變量,因此沒問題,但按鈕是以編程方式創建的,所以它們不應該在該「空白」片段中。 「Table Name」文本正在所有不同的Table Fragments上正確顯示,所以我很確定它在創建Seat Fragments時與我有關,但我不知道它會是什麼。所有的標籤都不一樣,第一張桌子就像一個魅力一樣。 enter image description here

Session我有一個方法來創建表,同時我創建座位。我首先想到它有事情做與提交服用一段時間,所以我搬出來從CreateTables但具有相同的結果:

private void CreateTables() 
     { 
      try 
      { 
       tables = new List<Fragments.Session.Table>(); 
       foreach (var table in A.ActiveSession.Tables) 
       { 
        FragmentTransaction trans = this.FragmentManager.BeginTransaction(); 
        var frag = new Fragments.Session.Table(); 
        trans.Add(Resource.Id.frameLayoutSessionTable, frag, "table-" + table.Id.ToString()); 
        trans.Commit(); 


        frag.CreateSeats(table.Seats); 
        tables.Add(frag); 
       } 

      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
       Toast.MakeText(this, "Could not create tables ...", ToastLength.Short).Show(); 
      } 
     } 

Table.CreateSeats():

public void CreateSeats(List<SessionSeatViewModel> _seats) 
     { 
      Console.WriteLine("Fragments.Table.CreateSeats()"); 

      seats = new List<Seat>(); 

      foreach (var seat in _seats) 
      { 
       Console.WriteLine("Tag: " + "seat-" + seat.Id.ToString()); 
       var tag = "seat-" + seat.Id.ToString(); 
       FragmentTransaction trans = this.FragmentManager.BeginTransaction(); 
       var frag = new Fragments.Session.Seat(); 
       trans.Add(Resource.Id.layoutSeats, frag, tag); 
       trans.Commit(); 
       seats.Add(frag); 
      } 
     } 

我可以在正在創建的席位如預期,當我把我的「Table.Show()」正確的座椅的ID被打印出來到日誌:

var activeTable = this.FragmentManager.FindFragmentByTag<Fragments.Session.Table>("table-" + table.Id.ToString()); 
        activeTable.Update(table); //Updates the seats with correct values 
        activeTable.Show(); 

Table.Show():

public void Show() 
     { 
      Console.WriteLine("Fragments.Table.Show()"); 
      this.FragmentManager.BeginTransaction().Show(this).Commit(); 
      foreach (var seat in seats) 
       seat.Show(); 
     } 

Seat.Show():

public void Show() 
     { 
      Console.WriteLine("Fragments.Session.Seat.Show()"); 
      this.FragmentManager.BeginTransaction().Show(this).Commit(); 
     } 

我也試過this.FragmentManager.ExecutePendingTransactions()我創建的每個表後CreateSeats沒有運氣了。

回答

0

說到嵌套片段,我們需要使用ChildFragmentManager。

這是我在Xamarin解決它:

Session我創建表像以前一樣:

private void CreateTables() 
     { 
      try 
      { 
       tables = new List<Fragments.Session.Table>(); 
       var trans = SupportFragmentManager.BeginTransaction(); 
       foreach (var table in A.ActiveSession.Tables) 
       { 
        var tag = "table-" + table.Id.ToString(); 
        var frag = new Fragments.Session.Table(); 
        trans.Add(Resource.Id.frameLayoutSessionTable, frag, tag); 
        tables.Add(frag); 
        if (mCurrentFragment == null) mCurrentFragment = frag; 
        else trans.Hide(frag); 
       } 
       trans.Commit(); 

      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
       Toast.MakeText(this, "Could not create tables ...", ToastLength.Short).Show(); 
      } 
     } 

Table.OnCreateView我創建一個使用ChildFragmentManager(固定大小的Seat片段只是暫時的):

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 
      Console.WriteLine("Table.OnCreateView"); 
      var view = inflater.Inflate(Resource.Layout.table_session, container, false); 

      mText = view.FindViewById<TextView>(Resource.Id.textViewTableSessionName); 

      var trans = ChildFragmentManager.BeginTransaction(); 
      seats = new List<Seat>(); 
      for (int i = 0; i < 9; i++) 
      { 

       var frag = new Fragments.Session.Seat(); 
       trans.Add(Resource.Id.layoutSeats, frag, "seat-" + (i+1).ToString()); 
       seats.Add(frag); 
      } 
      trans.Commit(); 

      return view; 
     } 

Session繼承自Android.Support.V4.App.FragmentTableSeat,從Android.Support.V4.App.Fragment

我在本教程下找到了答案:https://www.youtube.com/watch?v=3wEGeT3zg6I&list=PLCuRg51-gw5VqYchUekCqxUS9hEZkDf6l&index=62 (如果您不明白,請查看教程55和56)。

相關問題