Android “如何显示”;向上";/&引用;“后退”;Xamarin中的按钮。表单?

Android “如何显示”;向上";/&引用;“后退”;Xamarin中的按钮。表单?,android,xamarin,xamarin.android,xamarin.forms,android-appcompat,Android,Xamarin,Xamarin.android,Xamarin.forms,Android Appcompat,我正在尝试解决如何在Xamarin.Forms中显示“向上”箭头,而无需将页面推到堆栈上。也就是说,我只想在按下后退按钮时执行一个操作。我完全被困在这个问题上,所以任何帮助都将不胜感激 我已尝试创建一个自定义渲染器,该渲染器处理名为DisplayHomeAsBack的视图属性。在渲染器中调用以下命令: FormsAppCompatActivity context = ((FormsAppCompatActivity)Forms.Context); Android.Support.V7.App.A

我正在尝试解决如何在Xamarin.Forms中显示“向上”箭头,而无需将页面推到堆栈上。也就是说,我只想在按下后退按钮时执行一个操作。我完全被困在这个问题上,所以任何帮助都将不胜感激

我已尝试创建一个自定义渲染器,该渲染器处理名为
DisplayHomeAsBack
的视图属性。在渲染器中调用以下命令:

FormsAppCompatActivity context = ((FormsAppCompatActivity)Forms.Context);
Android.Support.V7.App.ActionBar actionBar = context.SupportActionBar;
if (actionBar != null)
{
  actionBar.SetDisplayHomeAsUpEnabled(element.DisplayHomeAsBack);
}
不幸的是,尽管所有的在线教程和android的stackoverflow问题都建议使用这种方法,但这似乎毫无用处

计划是我可以使用MasterDetailPage中的“OnBackButtonPressed”覆盖,这应该允许我执行此操作。不幸的是,到目前为止,显示后退按钮是一个更大的障碍

有没有更好的方法,或者如何让目前的机制发挥作用

编辑

我已经创建了一个项目,并将其上传到Xamarin支持论坛上的这个问题,如果有帮助的话。
对不起,让您久等了

警告说,我并没有实际运行这段代码,并从我自己的代码中对其进行了更改,所以如果它在没有任何更改的情况下工作得很好,我会感到惊讶

因此,下面应该在以前没有的地方添加一个后退按钮(就像没有真正的页面可返回时一样),然后我们将添加一个自定义操作以在按下时执行

我建议您在不使用动画的情况下将一个新页面推到堆栈上,这样对用户来说是透明的,并且使所有这一切变得更简单,但是如果您绝对不想这样做,下面的方法应该可以工作

主要活动:

//Use this to subscribe to the event which will create the back button
public override bool OnCreateOptionsMenu(IMenu menu) {

    if(menu != null && App.AppMasterPage != null) { //You will need this to make sure you are on your MasterDetailPage, just store a global reference to it in the App class or where ever

        Xamarin.Forms.MessagingCenter.Unsubscribe<string>(this, "CreateBackButton");
        Xamarin.Forms.MessagingCenter.Subscribe<string>(this, "CreateBackButton", stringWeWillNotUse => { //Use this to subscribe to the event that creates the back button, then when you want the back button to show you just run Xamarin.Forms.MessagingCenter.Send<string>(this, "CreateBackButton")

            ActionBar.DisplayOptions = ActionBarDisplayOptions.ShowTitle | ActionBarDisplayOptions.ShowHome | ActionBarDisplayOptions.UseLogo | ActionBarDisplayOptions.HomeAsUp; //You may need to play with these options to get it working but the important one is 'HomeAsUp' which should add the back button
        });
    } else {
        Xamarin.Forms.MessagingCenter.Unsubscribe<string>(this, "CreateBackButton");
    }

    return base.OnCreateOptionsMenu(menu);
}
//使用此按钮订阅将创建“后退”按钮的事件
公共覆盖布尔onCreateOptions菜单(IMenu菜单){
如果(menu!=null&&App.AppMasterPage!=null){//您将需要此选项来确保您位于MasterDetailPage上,只需在App类或任何地方存储对它的全局引用即可
Xamarin.Forms.MessagingCenter.Unsubscribe(这是“CreateBackButton”);
订阅(此“CreateBackButton”,stringWeWillNotUse=>{//使用此按钮订阅创建后退按钮的事件,然后当您希望后退按钮显示时,只需运行Xamarin.Forms.MessagingCenter.Send(此“CreateBackButton”)
ActionBar.DisplayOptions=ActionBarDisplayeptions.ShowTitle | ActionBarDisplayeptions.ShowHome | ActionBarDisplayeptions.UseLogo | ActionBarDisplayeptions.HomeAsUp;//您可能需要使用这些选项才能正常工作,但重要的是“HomeAsUp”,它应该添加后退按钮
});
}否则{
Xamarin.Forms.MessagingCenter.Unsubscribe(这是“CreateBackButton”);
}
返回base.onCreateOptions菜单(菜单);
}
现在,下一步是在按下时执行自定义操作。我认为您可以在
main活动中重写
OnBackPressed()
onoptionItemSelected()
,或者您可以重写
MasterDetailPage
方法。我不确定

在覆盖范围内,我只需检查您是否像上面那样在
App.AppMasterPage
上,如果是这样,请发送您的
App.AppMasterPage
已订阅的
MessagingCenter
消息,以便它处理自定义操作


如果你被卡住了,告诉我

我知道这听起来有点像黑客,但到目前为止,我找到的最好的“解决方案”是在当前页面后面(根后面)添加一个页面,使其不可见。然后,当用户按下后退按钮时,通过删除该页面来处理。

我认为这将取决于您试图覆盖后退按钮图标的位置。听起来像是您试图覆盖
MasterDetailPage
上的后退按钮图标,我假设它位于
导航页面中?另外,这是导航堆栈中的第一页还是您必须单击其他页面才能访问它?最后,您只想更改单击按钮时执行的操作,而不是更改按钮的实际外观是否正确?我想我只是在使用静态(在上面的代码中),所以我认为这并不重要,但我可能遗漏了一些内容。你是对的,我有一个MasterDetailPage,它有一个NavigationPage作为它的详细信息。MasterDetailPage是应用程序的主页面。为了让您了解我正在尝试做什么,我打开了一个内部视图,我希望该视图随着后退按钮的按下而消失(因此图标和行为需要更改)。如果可行,我很乐意以任何其他方式执行此操作。您是否尝试过在
main活动
中覆盖
OnOptionItemsSelected
?您可以找出要检查的菜单项Id,然后使用
MessagingCenter
发出信号,表示是时候执行自定义操作了,并在
OnOptionItemsSelected
中返回
false
,表示您自己正在处理它。如果这不起作用,那么您可能必须覆盖默认的“后退”按钮并实现您自己的按钮。但这不会将图标更改为后退?好的,那么您确实希望更改图标的外观。然后,我认为您需要覆盖
onCreateOptions菜单
,以更改单击图标时图标的外观和行为。当我有机会发布一个带有我的
oncreateoptions菜单
外观的答案时,我正在添加一个自定义图标,而不仅仅是尝试重新添加箭头,这样可能会有点不同。我想你也可以把一个新页面推到屏幕上,但它看起来会完全一样,只是它有你的自定义视图显示。。。然后你会得到返回按钮,它会运行感谢你的帮助,这并没有直接帮助我,但我确实从我们的讨论中得到了这个想法。请参阅我用作o的解决方案