2016-10-04 34 views
0

Ich habe eine Aktivität namens Session, die verschiedene Tabellen zeigt und wenn die Schaltfläche für jede Tabelle angeklickt wird, sollte die Seats angezeigt werden, aber sie werden nur für die erste Tabelle angezeigt.Nur das erste Fragment ist korrekt gezeichnet

Sitzung enthält eine Liste der Table Fragments und jede Tabelle enthält eine Liste der Seat Fragments.

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

Erwartetes Ergebnis auf allen Tischen: enter image description here

Wie es auf allen Tischen, außer auf der ersten Tabelle aussieht: enter image description here

Auch wenn ich die Session Aktivität eine leere Tabelle eingeben erstellt mit dem "Table Name" und den "Seats" mit dem Namen der Seat Fragment, die seltsam ist. "Tabellenname" ist eine Variable, die aus der Layout-Datei genommen wird, so dass es in Ordnung ist, aber die Schaltflächen werden programmatisch erzeugt, so dass sie nicht in diesem "leeren" Fragment sein sollten. Der "Tabellenname" Text wird auf allen verschiedenen Table Fragments richtig angezeigt, so dass ich ziemlich sicher bin, dass es etwas damit zu tun hat, wenn ich die Seat Fragments erstelle, aber ich weiß nicht, was es sein könnte. Alle Tags sind unterschiedlich und die erste Tabelle funktioniert wie ein Zauber. enter image description here

In Session Ich habe eine Methode, um die Tabellen zu erstellen und gleichzeitig die Sitze zu erstellen. Ich dachte zuerst hatte es etwas mit dem zu tun Commit einige Zeit so nehmen zog ich es von create, aber mit dem gleichen Ergebnis:

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

ich kann, dass die Sitze werden wie erwartet erstellt und wenn ich meinen „Table.Show()“ rufe das korrekte Sitz-IDs in das Protokoll ausgedruckt werden:

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

Ich habe auch versucht this.FragmentManager.ExecutePendingTransactions() nachdem ich jede Tabelle erstellt und vor CreateSeats ohne Glück.

Antwort

0

Wenn es um verschachtelte Fragmente geht, müssen wir den ChildFragmentManager verwenden.Diese

ist, wie ich es in Xamarin gelöst:

Unter Session erstelle ich die Tabellen vor:

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

Unter Table.OnCreateView erstelle ich die Seat Fragmente, die die ChildFragmentManager (die feste Größe unter Verwendung ist nur vorübergehend):

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 erbt von Android.Support.V4.App.Fragment, Table und Seat von Android.Support.V4.App.Fragment.

Ich fand die Antwort in diesem Tutorial: https://www.youtube.com/watch?v=3wEGeT3zg6I&list=PLCuRg51-gw5VqYchUekCqxUS9hEZkDf6l&index=62 (Überprüfen Sie Tutorial 55 und 56, wenn Sie nicht verstehen).

Verwandte Themen