I have a class that inherits from DialogFragment
called UnseatedPlayers
which shows a list of available (unseated) players.
From another class called ActiveTable
when an empty seat is clicked on the UnseatedPlayers
dialog fragment appears but when I press back, the dialog fragment disappears (as expected) and I click on any of the free seats and 2 dialog fragments appears stacked on each other and if I repeat the process 4 dialog fragments and then 8 and so on.
I think it has something to do with that I create a new dialog fragment each time I click on a seat:
private void FreeSeatPlayer_Click(object sender, EventArgs e)
{
var button = sender as Button;
int seatId = (int)button.Tag;
var trans = this.FragmentManager.BeginTransaction();
var unseatedPlayers = new UnseatedPlayers(seatId);
unseatedPlayers.OnDimissEvent += UnseatedPlayers_OnDimissEvent;
unseatedPlayers.Show(trans, "unseated_players");
}
But I'm not sure as when I press back it should dismiss the dialog fragment in a correct way and according to this post:
Dismiss the fragment and its dialog. If the fragment was added to the back stack, all back stack state up to and including this entry will be popped. Otherwise, a new transaction will be committed to remove the fragment.
Why are the dialog fragments appearing on each other?
ActiveTable.cs (this is where UnseatedPlayers is instantiated):
namespace Droid.Pages.Session
{
public class ActiveTable : Page
{
public TableListItemViewModel Model { get; set; }
public List<Button> Seats { get; set; }
public ActiveTable(FragmentManager fragmentManager, int resourceId, TableListItemViewModel model)
{
FragmentManager = fragmentManager;
base.ResourceId = resourceId;
Model = model;
base.Name = model.Name;
}
public override View Draw(ViewGroup container)
{
View view = LayoutInflater.From(container.Context).Inflate(Resource.Layout.session, container, false);
container.AddView(view);
var root = view.FindViewById<LinearLayout>(Resource.Id.sessionBody);
Context context = view.Context;
Seats = new List<Button>();
foreach (var seat in Model.Seats)
{
Button btn = new Button(context);
btn.Tag = seat.Id;
DrawSeat(btn, seat);
root.AddView(btn);
Seats.Add(btn);
}
return view;
}
private Button DrawSeat(Button button, SeatListItemViewModel seat)
{
if (seat.Occupied)
return DrawOccupiedSeat(button, seat);
else
return DrawFreeSeat(button, seat);
}
private Button DrawOccupiedSeat(Button button, SeatListItemViewModel seat)
{
button.SetBackgroundResource(Resource.Drawable.button_default);
if (seat.SeatType == "Player")
{
button.Text = seat.User.Name;
button.Click += OccupiedSeatPlayer_Click;
return button;
}
else if(seat.SeatType == "Dealer")
{
button.Text = "DEALER: " + seat.User.Id.ToString();
button.Click += OccupiedSeatDealer_Click;
return button;
}
throw new NotImplementedException();
}
private Button DrawFreeSeat(Button button, SeatListItemViewModel seat)
{
button.Text = seat.SeatNumber.ToString() + ": Sentar";
button.SetBackgroundResource(Resource.Drawable.button_green);
if(seat.SeatType == "Player")
button.Click += FreeSeatPlayer_Click;
else if(seat.SeatType == "Dealer")
button.Click += FreeSeatDealer_Click;
return button;
}
private void RedrawSeats()
{
Model = A.GetCustomer().Tables.Where(c => c.Id == Model.Id).FirstOrDefault();
foreach (var btn in Seats)
{
var id = (int)btn.Tag;
var seat = Model.Seats.Where(c => c.Id == id).FirstOrDefault();
DrawSeat(btn, seat);
}
}
/* Events */
private void OccupiedSeatPlayer_Click(object sender, EventArgs e)
{
var button = sender as Button;
int seatId = (int)button.Tag;
var seat = Model.Seats.Where(c => c.Id == seatId).FirstOrDefault();
var player = A.GetPlayer(seat.User.Id);
var playerSession = player.GetActivePlayerSession();
var trans = FragmentManager.BeginTransaction();
var frag = new Fragments.PlayerSessions.PlayerSession(playerSession);
trans.Replace(base.ResourceId, frag, "player_session");
trans.AddToBackStack("player_session");
trans.Commit();
}
private void FreeSeatPlayer_Click(object sender, EventArgs e)
{
var button = sender as Button;
int seatId = (int)button.Tag;
var trans = this.FragmentManager.BeginTransaction();
var unseatedPlayers = new UnseatedPlayers(seatId);
unseatedPlayers.OnDimissEvent += UnseatedPlayers_OnDimissEvent;
unseatedPlayers.Show(trans, "unseated_players");
}
private void FreeSeatDealer_Click(object sender, EventArgs e)
{
var button = sender as Button;
int seatId = (int)button.Tag;
var trans = this.FragmentManager.BeginTransaction();
var unseatedDealers = new UnseatedDealers(seatId);
unseatedDealers.OnDimissEvent += UnseatedDealers_OnDimissEvent;
unseatedDealers.Show(trans, "unseated_dealers");
}
private void OccupiedSeatDealer_Click(object sender, EventArgs e)
{
var button = sender as Button;
int seatId = (int)button.Tag;
var seat = A.GetSeat(seatId);
var dealer = A.GetDealer(seat.User.Id);
var dealerSession = dealer.DealerSessions.Where(c => String.IsNullOrEmpty(c.EndDate)).FirstOrDefault();
var trans = this.FragmentManager.BeginTransaction();
var closeDealerSession = new Fragments.Sessions.CloseDealerSession(dealerSession, seatId);
//unseatedPlayers.OnDimissEvent += UnseatedPlayers_OnDimissEvent;
closeDealerSession.Show(trans, "close_dealer_session");
}
private void UnseatedDealers_OnDimissEvent(object sender, bool e)
{
RedrawSeats();
}
private void UnseatedPlayers_OnDimissEvent(object sender, bool e)
{
RedrawSeats();
}
}
}
UnseatedPlayers.cs
namespace Droid.Fragments.Users.Player
{
public class UnseatedPlayers : DialogFragment
{
public event EventHandler<bool> OnDimissEvent;
private RecyclerView mPlayers;
private RecyclerView mRecyclerView;
private RecyclerView.LayoutManager mLayoutManager;
private UnseatedPlayersRecyclerAdapter mAdapter;
private int seatId;
public UnseatedPlayers(int seatId)
{
this.seatId = seatId;
}
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// Use this to return your custom view for this Fragment
// return inflater.Inflate(Resource.Layout.YourFragment, container, false);
var view = inflater.Inflate(Resource.Layout.unseated_players, container);
Dialog.Window.SetTitle("Unseated Players");
mRecyclerView = view.FindViewById<RecyclerView>(Resource.Id.recyclerViewUnseatedPlayers);
mLayoutManager = new LinearLayoutManager(mRecyclerView.Context);
mRecyclerView.SetLayoutManager(mLayoutManager);
mAdapter = new UnseatedPlayersRecyclerAdapter(A.GetUnseatedPlayers());
mAdapter.ItemClick += mAdapter_ItemClick;
mRecyclerView.SetAdapter(mAdapter);
return view;
}
public override void OnDismiss(IDialogInterface dialog)
{
if (OnDimissEvent != null)
OnDimissEvent(dialog, true);
}
private async void mAdapter_ItemClick(object sender, int position)
{
try
{
var player = A.GetUnseatedPlayers()[position];
ProgressDialog progressDialog = ProgressDialog.Show(this.Activity, "", "Seating player ...", true);
progressDialog.SetProgressStyle(ProgressDialogStyle.Spinner);
var response = await nw.SeatPlayer(A.TokenString, player.Id, seatId);
progressDialog.Hide();
if (response.Error)
Toast.MakeText(this.Activity, response.Message, ToastLength.Short).Show();
else
{
A.GetPlayer(player.Id).PlayerSessions.Add(response.PlayerSession);
A.GetSeat(seatId).Update(response.Seat);
this.Dismiss();
}
}
catch (Exception)
{
Toast.MakeText(this.Activity, "Something went wrong ...", ToastLength.Short).Show();
}
}
}
}