2016-10-04 5 views
0

Sessionというアクティビティがあり、異なるテーブルが表示され、各テーブルのボタンをクリックすると、Seatsが表示されますが、最初のテーブルにのみ表示されます。最初のフラグメントのみが正しく描画されます

セッションにはTable Fragmentsのリストが含まれ、各テーブルにはSeat Fragmentsのリストが含まれています。すべてのテーブル上の

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

期待される結果:私は、空のテーブルが作成されSessionアクティビティを入力したときにも enter image description here

:それは最初のテーブルを除くすべてのテーブルの上にどのように見えるか enter image description here

"Table Name"と "Seats"はSeat Fragmentで設定された名前が奇妙です。 "テーブル名"はレイアウトファイルから取った変数なので大丈夫ですが、ボタンはプログラマチックに作成されるので、 "空"の部分には入れないようにしてください。 "テーブル名"のテキストは、すべて異なるTable Fragmentsに正しく表示されているので、私はSeat Fragmentsを作成しているときと何か関係があるとは確信していますが、それが何であるか分かりません。すべてのタグは異なり、最初のテーブルは魅力のように機能します。 enter image description here

Session私はテーブルを作成すると同時にシートを作成する方法があります。

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

私はそれをすることができます私は最初、それは私がCreateTablesからそれを移動しますが、同じ結果といくつかの時間を割いコミットとは何かを持っていたと思いました座席は期待通りに作成されていると私は私の「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(); 
     } 

私は各テーブルを作成し、運とCreateSeats前にした後、私はまた、this.FragmentManager.ExecutePendingTransactions()を試してみました。

答えて

0

ネストされたフラグメントについては、ChildFragmentManagerを使用する必要があります。

これは私がXamarinでそれを解決する方法である:

Sessionの下で、私は以前のようにテーブルを作成:Table.OnCreateViewの下

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

私は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継承,TableおよびSeatからAndroid.Support.V4.App.Fragmentまでである。

私はこのチュートリアルの回答を見つけました:https://www.youtube.com/watch?v=3wEGeT3zg6I&list=PLCuRg51-gw5VqYchUekCqxUS9hEZkDf6l&index=62 (わからないのならチュートリアル55と56をチェックしてください)

関連する問題