0

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();
            }
        }
    }
}
Community
  • 1
  • 1
Westerlund.io
  • 2,743
  • 5
  • 30
  • 37
  • Can you add more code to this post? Such as your `UnseatedPlayers` class? – Jon Douglas Oct 19 '16 at 20:44
  • @JonDouglas I added ActiveTable and UnseatedPlayers. UnseatedPlayers is called from ActiveTable. Thanks for your time Mr Code Monkey! – Westerlund.io Oct 19 '16 at 20:57
  • It sounds like you might want to check the count of the current backstack: https://developer.xamarin.com/api/property/Android.App.FragmentManager.BackStackEntryCount/ You may need to `remove()` Fragments when you're done and `commit()` them. – Jon Douglas Oct 19 '16 at 21:31
  • Thanks @JonDouglas I added those parts but I think the problem was with the Click Events being recreated. It works now after I reorganized the code to not re-create the Click Handlers. Thanks for your time! – Westerlund.io Oct 19 '16 at 23:25

0 Answers0