2015-02-27 40 views
11

Tôi muốn ngăn đóng ứng dụng bằng cách nhấn nút quay lại phần cứng ở dạng xamarin trên Android.Ngăn chặn đóng bằng nút quay lại ở dạng xamarin trên android

Tôi muốn, bạn có thể điều hướng bằng nút quay lại phần cứng trong ứng dụng (những gì đang hoạt động), nhưng không muốn thoát, khi trang đầu tiên trong ngăn điều hướng được tiếp cận.

Tôi đã cố gắng sử dụng sự kiện OnSleep ở dạng xamarin, nhưng ở đây tôi không thể hủy thoát.

Tôi cũng đã cố gắng bắt các nút quay lại trong android:

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

Nhưng khi sử dụng Xamarin hình thức, tôi không biết trang nào hiện đang hiển thị. Vì vậy, tôi không biết liệu điều hướng có được phép hay không

Trả lời

14

Nó hoạt động với việc đánh giá NavigationStack (khi bạn sử dụng NavigationPage).

Trong Hoạt động của tôi, tôi ghi đè OnBackPressed

public override void OnBackPressed() 
{ 
    if(App.Instance.DoBack) 
    { 
     base.OnBackPressed(); 
    } 
} 

Trong ứng dụng hình thức Xamarin tôi (App.Instance (nó là một singleton)), tôi sẽ đánh giá NavigationStack của trang hiện tại như thế này.

public bool DoBack 
{ 
    get 
    { 
     NavigationPage mainPage = MainPage as NavigationPage; 
     if (mainPage != null) 
     { 
      return mainPage.Navigation.NavigationStack.Count > 1; 
     } 
     return true;     
    } 
} 

Khi chỉ còn lại một trang trong NavigationStack, tôi sẽ không gọi base.OnBackPressed, để tôi sẽ không đóng ứng dụng.

! [Thử nghiệm]

0

Đây là một giải pháp hoạt động trên Android.
Giới thiệu bộ đếm trong lớp ứng dụng và tăng số lượt truy cập với mỗi OnStart và giảm số lượng này với mỗi OnStop theo cách này khi bộ đếm là bạn sẽ biết bạn đang ở hoạt động cuối cùng của mình.

Không cần phải nói, hãy sử dụng triển khai hoạt động cơ sở để bạn không phải sao chép mã bảng nồi hơi.

+0

Điều này sẽ không hoạt động, bởi vì tôi đang sử dụng biểu mẫu xamarin, để tôi chỉ có một hoạt động – Chris

9

Và đây là những gì các mã có thể trông giống như một Xamarin Forms kịch bản trang 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; 
     } 
    } 
2

Chỉ cần cho một cuộc gọi trống trong trang nơi nào bạn muốn ngăn chặn , như

protected override bool OnBackButtonPressed() 
{ 
return true; 
} 

Điều này sẽ ngăn chặn nút quay lại trong XF-Droid.

0

Giải pháp được đề xuất có thể hoạt động tốt, nhưng tôi không thích "phơi nhiễm thuộc tính tĩnh" để giải quyết các vấn đề. Hơn nữa, tôi không thích việc sử dụng các giải pháp "các thuộc tính như các phương thức", đặc biệt khi có rất nhiều logic liên quan.

Vấn đề chính ở đây là cách chúng tôi có thể xử lý phương thức OnBackButton() từ lớp Xamarin.Forms.Application của chúng tôi.

Điều gì sẽ làm tương tự một cách thanh lịch hơn?

Trước tiên, bạn cần mở rộng Xamarin.Forms.Lớp ứng dụng như sau:

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 
    } 
} 

Triển khai ứng dụng của bạn bây giờ sẽ sử dụng lớp này làm lớp cơ sở. Hãy nhớ sửa đổi xaml và xaml.cs của bạn cho phù hợp:

<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> 

Trong triển khai App.cs của bạn, bạn có thể ghi đè phương pháp 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 
} 

Sau đó, bạn cần thay đổi một chút việc triển khai lớp Hoạt động của mình.

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 
} 
Các vấn đề liên quan