web-dev-qa-db-ja.com

android上のxamarinフォームで戻るボタンで閉じるのを防ぐ

Androidのxamarinフォームでハードウェアの戻るボタンを押してアプリを閉じないようにしたい。

ナビゲーションスタックの最初のページに到達したときに、アプリのハードウェアの戻るボタン(機能しているもの)を使用してナビゲートできますが、終了したくないと思います。

Xamarinフォームで OnSleep イベントを使用しようとしましたが、ここでは出口をキャンセルできません。

私はまた、Androidで戻るボタンをキャッチしてみました:

    public override void OnBackPressed()
    {
        //base.OnBackPressed();
    }

しかし、xamarinフォームを使用している場合、現在どのページが表示されているかわかりません。ですから、戻るナビゲーションが許可されているかどうかはわかりません

17
Chris

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を呼び出さないため、アプリを閉じません。

![テスト]

18
Chris

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;
        }
    }
11
Iain STIRZAKER

ページで空白の電話をかけるだけで、どこで防止したいですか?

protected override bool OnBackButtonPressed()
{
return true;
}

これは、XF-Droidの戻るボタンを防ぎます。

9
Senthamizh

現在_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();
        }
    
    } 
    _
2
Prateek

Androidで動作するソリューションは次のとおりです。
アプリケーションクラスにカウンターを導入し、OnStartごとにカウンターをインクリメントし、カウンターが1の場合、このようにOnStopごとにカウンターをデクリメントしますあなたがあなたの最後の活動にいることを知るでしょう。

言うまでもなく、ボイラープレートのコードをコピーして貼り付ける必要がないように、基本アクティビティの実装を使用します。

0
Alex.F
0

提案された解決策はうまく機能しますが、問題を解決するために「静的プロパティの公開」が好きではありません。さらに、「多くのロジックが含まれる場合は特に、「メソッドとしてのプロパティ」ソリューションの使用は好きではありません。

ここでの主な問題は、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
}
0
Francesco