解散了排队的对话范围 - 他们只是不断回来



我正在学习如何在Xamarin中开发Android应用程序,但是几乎相同的Java原始内容。我正在尝试实施一个多二元格过程,通过该过程编辑数据库条目的某些功能。我暂时有两个 - timechangefragment和dateChangeFragment。我在MainActvity中创建它们,并具有分别称为OnNewTimePass和OnNewDatePass的接口,通过此信息,我将其发送回用户的输入,并通知MainActvity,它应该忽略此对话fragment,请显示下一个对话。

代码看起来如下:

对话框片段:

   public class TimeChangeDialog : DialogFragment
    {
        public int _id;
        ViewGroup _container;
        public interface OnNewTimePass
        {
            void onNewTimePass(DateTime date, int id);
            void openDateDialog(int id, Bundle savedInstanceState)
            void closeTimeDialog(ReminderTimeDialog dialog);
        }
        public OnNewTimePass dataPasser
        {
            get; set;
        }
        public static ReminderTimeDialog NewInstance(Bundle bundle)
        {
            ReminderTimeDialog fragment = new ReminderTimeDialog();
            fragment.Arguments = bundle;
            return fragment;
        }
        public override void OnAttach(Activity a)
        {
            base.OnAttach(a);
            dataPasser = (OnNewTimePass)a;
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            /*onCreate, inflateView, handle dataetc.*/
            Button buttonNext = view.FindViewById<Button>(Resource.Id.DialogButtonNext);

            buttonNext.Click += delegate {
                goToNext(view,savedInstanceState);
           //Dismiss();
            };
            return view;

        }

      public override void OnDismiss(IDialogInterface dialog)
        {
            base.OnDismiss(dialog);
            Dismiss();
        }

        public void goToNext(View view, Bundle savedInstanceState)
        {
            /* handle data here */
            dataPasser.onNewTimePass(_workingtime, _id);
            dataPasser.openDateDialog(_id, savedInstanceState);
            dataPasser.closeTimeDialog(this);
        }
    }
}

主要活动:(实施TimeChangeFragment.OnNewTimePass,

DateChangeFragment.OnNewDatePass) ###
    public void closeTimeDialog(dialog){
    FragmentTransaction ft = FragmentManager.BeginTransaction();
    ft.Remove(dialog);
    FragmentManager.addToBackStack('close-time');
    ft.Commit();
    //Also tried i.e. dialog.Dismiss(); here
    }
    public void openDateDialog(int id,Bundle bundle) {
                 FragmentTransaction ft = FragmentManager.BeginTransaction();
                  //Remove fragment
                  Fragment prev = FragmentManager.FindFragmentByTag("dialog");
                  if (prev != null)
                  {
                      ft.Remove(prev);
                  }
                  ft.AddToBackStack("date-dialog");
                // Create and show the dialog.
                TimeChangeFragment dateDialog = DateChangeFragment.NewInstance(taskdata);
                  dateDialog.Arguments = taskdata;
                  dateDialog.SetStyle(DialogFragmentStyle.NoTitle, 0);
                  dateDialog.Show(ft, "date-dialog");
    /*handle data here*/
            }

类似地,对于datechangedialog,只有我no opennextdialog()。

错误:

当我离开最终对话框片段时,第一个片段重新出现,重新开始过程。

注意:

我已经呆了几天了,并且在关闭了奇异的对话范围和类似问题的情况下,阅读了这里发布的许多建议。我尝试了大多数。有人说碎片本身处理自己的交易,因此在其中召集()是正确的方法(以及覆盖的ondismiss())。但是,当我这样做时,即使opendatedialog()在解雇之前被调用,第二片甚至没有出现;或者,甚至更令人愉悦的是,它的onattach被打来了,但对话框本身并没有出现。在一种情况下,我已经将所有碎片管理留给了主要活动,而另一个情况下的片段(甚至让第二个碎片是从第一个碎片中产生的),但似乎持续存在。我读过的一个建议说,背串需要弹出没有对话的状态,或者需要优先考虑交易,而不仅仅是放在后堆上。我尝试过后者无济于事。至于前者,我仍然不清楚在哪里应处理交易的地方。如果在主攻击中,我如何正确地引用对话框关闭。如果在对话范围内,当该活动本身是活动的一部分时,如何获得FragmentManager?非常感谢您的任何答案。

当我离开最终对话框片段时,第一个片段重新出现,重新开始过程。

第一个日期对话框再次出现,因为您再也不会被驳回。

要解决问题,您可以在第一个datedialog添加引用,并在解散第二个对话框(timedialog)时将其删除:

主动脉:

public class MainActivity : Activity, ReminderDateDialog.OnNewDatePass,ReminderTimeDialog.OnNewTimePass//,taskedit_BaseFragment.OnChangeAddDataPass
{
    DateTime _tempDateTime = DateTime.MinValue;
    ReminderDateDialog dateDialog;// use a variable to temporarily store the date dialog
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.Main);
        var btnChange =FindViewById<Button>(Resource.Id.ReallySurelyAButton);
        btnChange.Click += delegate
        {
            openDateDialog(3,bundle);
        };
    }
    public void closeTimeDialog(ReminderTimeDialog dialog)
    {
        FragmentTransaction ft = FragmentManager.BeginTransaction();
         ft.Remove(dialog);
         ft.AddToBackStack("close-time");
         dialog.Dismiss();
        dateDialog.Dismiss();// dismiss the date dialog after the time dialog;
    }
    ...
}

相关内容

最新更新