Androidのxamarinフォームでハードウェアの戻るボタンを押してアプリを閉じないようにしたい。
ナビゲーションスタックの最初のページに到達したときに、アプリのハードウェアの戻るボタン(機能しているもの)を使用してナビゲートできますが、終了したくないと思います。
Xamarinフォームで OnSleep イベントを使用しようとしましたが、ここでは出口をキャンセルできません。
私はまた、Androidで戻るボタンをキャッチしてみました:
public override void OnBackPressed()
{
//base.OnBackPressed();
}
しかし、xamarinフォームを使用している場合、現在どのページが表示されているかわかりません。ですから、戻るナビゲーションが許可されているかどうかはわかりません
NavigationStackの評価(NavigationPageを使用する場合)で機能します。
私のアクティビティでは、OnBackPressedをオーバーライドします
public override void OnBackPressed()
{
if(App.Instance.DoBack)
{
base.OnBackPressed();
}
}
私のxamarinフォームアプリ(App.Instance(これはシングルトンです))では、現在のページのNavigationStackを次のように評価します。
public bool DoBack
{
get
{
NavigationPage mainPage = MainPage as NavigationPage;
if (mainPage != null)
{
return mainPage.Navigation.NavigationStack.Count > 1;
}
return true;
}
}
NavigationStackに1ページしか残っていない場合、base.OnBackPressedを呼び出さないため、アプリを閉じません。
![テスト]
XamarinフォームのMasterDetailページシナリオのコードは次のようになります...
public bool DoBack
{
get
{
MasterDetailPage mainPage = App.Current.MainPage as MasterDetailPage;
if (mainPage != null)
{
bool canDoBack = mainPage.Detail.Navigation.NavigationStack.Count > 1 || mainPage.IsPresented;
// we are on a top level page and the Master menu is NOT showing
if (!canDoBack)
{
// don't exit the app just show the Master menu page
mainPage.IsPresented = true;
return false;
}
else
{
return true;
}
}
return true;
}
}
ページで空白の電話をかけるだけで、どこで防止したいですか?
protected override bool OnBackButtonPressed()
{
return true;
}
これは、XF-Droidの戻るボタンを防ぎます。
現在_App.Instance
_がなく、プラットフォームコード内で静的にAppにアクセスできないため、Chrisの答えを拡張します。
1。_App.xaml.cs
_
_public bool DoBack
{
get
{
return MainPage.Navigation.NavigationStack.Count > 1;
}
}
_
2 ._MainActivity.cs
_ Androidプロジェクト
クラス変数Appを宣言する
_App app;
_
OnCrate(Bundle bundle)
をLoadApplication(new App());
に変更
app = new App();
LoadApplication(app);
およびオーバーライドメソッドOnBackPressed()
_public override void OnBackPressed()
{
if (app.DoBack)
{
base.OnBackPressed();
}
}
_
Androidで動作するソリューションは次のとおりです。
アプリケーションクラスにカウンターを導入し、OnStart
ごとにカウンターをインクリメントし、カウンターが1の場合、このようにOnStop
ごとにカウンターをデクリメントしますあなたがあなたの最後の活動にいることを知るでしょう。
言うまでもなく、ボイラープレートのコードをコピーして貼り付ける必要がないように、基本アクティビティの実装を使用します。
このnugetを使用できます chd.hwBackButtonManager nuget
提案された解決策はうまく機能しますが、問題を解決するために「静的プロパティの公開」が好きではありません。さらに、「多くのロジックが含まれる場合は特に、「メソッドとしてのプロパティ」ソリューションの使用は好きではありません。
ここでの主な問題は、Xamarin.Forms.ApplicationクラスからOnBackButton()メソッドを処理する方法です。
もっとエレガントな方法で同じことをするのはどうですか?
まず、次のようにXamarin.Forms.Applicationクラスを拡張する必要があります。
namespace YourNameSpace
{
public class Application : Xamarin.Forms.Application
{
#region Public Methods
public bool HandleBackButton()
{
return OnBackPressed();
}
#endregion
#region Application Methods
protected virtual bool OnBackPressed()
{
return false;
}
#endregion
}
}
アプリの実装では、このクラスを基本クラスとして使用します。 xamlとxaml.csを適宜変更してください。
<common:Application xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.Microsoft.com/winfx/2009/xaml"
xmlns:common="clr-namespace:YourNameSpace"
x:Class="YourNameSpace.App">
</common:Application>
App.cs実装で、OnBackButton()メソッドをオーバーライドできるようになりました。
public partial class App : YourNameSpace.Application
{
#region Constructors
public App()
{
InitializeComponent();
}
#endregion
#region App Methods
protected override bool OnBackPressed()
{
// Handle when the back button is pressed
return false;
}
#endregion
}
次に、Activityクラスの実装を少し変更する必要があります。
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
#region Constants and Fields
private App _app;
#endregion
#region Activity Methods
protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
_app = new App();
LoadApplication(_app);
}
public override void OnBackPressed()
{
if(!_app.HandleBackButton())
base.OnBackPressed();
}
#endregion
}