我有一个名为Session
的活动,它显示了不同的表格,当点击每个表格的按钮时,应显示Seats
,但它们只显示在第一个表格上。
会话包含Table Fragments
的列表,每个表都包含Seat Fragments
的列表。
[Activity] Session
[List<TableFragment>] Tables
[List<SeatFragment>] Seats
同样,当我输入Session
活动时,会创建一个空表,其中包含“表名”和“座位”,其名称由Seat Fragment
设置,这很奇怪。 “表名”是从布局文件中获取的变量,因此可以,但按钮是以编程方式创建的,因此它们不应该位于“空”片段中。 “表名”文本正在所有不同的Table Fragments
上正确显示,所以我很确定它与我创建Seat Fragments
时有关但我不知道它是什么可能。所有标签都不同,第一个表就像魅力一样。
在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
但没有运气。
答案 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}},Table
和Seat
。
我在本教程中找到了答案:https://www.youtube.com/watch?v=3wEGeT3zg6I&list=PLCuRg51-gw5VqYchUekCqxUS9hEZkDf6l&index=62 (如果您不理解,请查看教程55和56)。