只绘制了第一个片段

时间:2016-10-04 19:59:01

标签: android android-fragments xamarin

我有一个名为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 Fragments上正确显示,所以我很确定它与我创建Seat Fragments时有关但我不知道它是什么可能。所有标签都不同,第一个表就像魅力一样。 enter image description here

Session我有一个方法来创建表格,同时我创建了座位。我首先想到它与Commit有关,需要一些时间,所以我将它从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但没有运气。

1 个答案:

答案 0 :(得分: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下,我使用Seat创建ChildFragmentManager片段(固定大小只是暂时的):

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.Fragment的{​​{1}},TableSeat

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

相关问题