2016-10-26 3 views
0

私のプロジェクトはマスターディテールナビゲーションで構築されています。 リストには、リソース、連絡先、ログインという3つのページがあります。 すべてがiOSではうまく動作しますが、ユーザーがDroid/WinPhoneデバイスのハードウェアの戻るボタンを押すと、アプリは終了します。 すべてのデバイスで動作するXamarin Formsのためのapp-exitメカニズムはありますか? (プラットフォームに依存しないネイティブコードを意味します) ありがとうございます。Xamarinフォームでアプリケーションを終了するには?

答えて

1

私が知る限り、Xamarinアプリケーションでアプリを終了する方法はありません。

唯一の方法は、依存関係サービスを使用することです。あなたのContentPageでOnBackButtonPressed関数をオーバーライドし、それが最後のページで確認してください:YourAndroidDependencyクラスで

protected override bool OnBackButtonPressed() 
{ 
if(navigation.NavigationStack.Count == 1)//navigation is MainPage.Navigation 
    DependencyService.Get<YourDependencyInterface>().CloseApp(); 
} 

のためのAndroid:私はよく分からない

public void CloseApp() 
{ 
(Xamarin.Forms.Forms.Context as Activity).Finish(); 
} 

としてWinPhoneのために、私はそれを信じて同じ方法で - 依存関係サービスを行うことができます。次の操作を行い、あなたのUI(PCL)で

+0

あなたのコードは私のプロジェクトをより良くするのを助けました。しかし、特定のページが実行されたときにナビゲーションスタックをクリアしたいとします。たとえば、ユーザーが[リソース]ページをクリックしたときに、ナビゲーションスタックの履歴をクリアしたい場合、何か方法はありますか? そして、あなたの時間のおかげで... – Senthamizh

+0

あなたは、リソースページをnavigation.InsertPageBeforeにプッシュすることができます ()navigation.PopToRootAsync();私は何をしたのですか: – Dima

+0

'for(int i = 0; navigation.NavigationStack。Count> 1;){//すべてのページを廃棄する var page = navigation.NavigationStack.ElementAt(i); if(page.BindingContext!= null && page.BindingContextがBaseViewModel){ (BaseViewModelとしてpage.BindingContext).OnDisappearing(); page.BindingContext = null; } navigation.PopAsync(false); //アニメーションがありません navigation.RemovePage(ページ); // AnimationNavigationPageでクラッシュする } ' – Dima

4

私はINativeHelper

public class NativeHelper : INativeHelper 
{ 
    public void CloseApp() 
    { 
     Android.OS.Process.KillProcess(Android.OS.Process.MyPid()); 
    }     
} 

IOS

でINativeHelperの実装の実装を作っこのようxamarinフォームで

に私はインターフェイスにAndroidのプロジェクトで

public interface INativeHelper 
{ 
    void CloseApp(); 
} 

を追加したことをやりました

public class NativeHelper : INativeHelper 
{ 
    public void CloseApp() 
    { 
     Process.GetCurrentProcess().CloseMainWindow(); 
     Process.GetCurrentProcess().Close(); 
    }  
} 

そしてちょうどXamarin.Formsプロジェクト

protected override bool OnBackButtonPressed() 
    { 
     INativeHelper nativeHelper = null; 
     nativeHelper = DependencyService.Get<INativeHelper>(); 
     if (nativeHelper != null) 
     { 
      nativeHelper.CloseApp(); 
     } 

     return base.OnBackButtonPressed(); 
    } 

でページにOnBackButtonPressedメソッドをオーバーライド私はWinPhoneの実装を行っていなかったが、それは類似していなければなりません。

+0

ありがとうございました...あなたのコードは、iOSアプリケーションを閉じるのを助けました... – Senthamizh

3

あなたはあなたの物理的なバックボタンが押されたアプリを閉じるためDepedencyServiceを使用することができます

protected override bool OnBackButtonPressed() 
{ 
    if (Device.OS == TargetPlatform.Android) 
     DependencyService.Get<IAndroidMethods>().CloseApp(); 

    return base.OnBackButtonPressed(); 
} 

今のAndroid固有のロジックを実装します

[assembly: Xamarin.Forms.Dependency(typeof(AndroidMethods))] 
namespace Your.Namespace 
{ 
    public class AndroidMethods : IAndroidMethods 
    { 
     public void CloseApp() 
     { 
      Android.OS.Process.KillProcess(Android.OS.Process.MyPid()); 
     } 
    } 
} 

また、(あなたのUI PCLに)インタフェースを作成します:あなたのAndroidプロジェクトで

public interface IAndroidMethods 
{ 
    void CloseApp(); 
} 
+0

... おかげでたくさんの男... しかし、私はまだXamarin.Windowsでアプリを終了する方法を得るために苦労しています。私は私の側から努力しています、そして、あなたの助け/指導は評価されるでしょう... – Senthamizh

関連する問題