我正在学习如何在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;
}
...
}