2017-06-12 14 views
0

私は現在、デバイス上でプッシュ通知を受け取ったプロジェクトで作業しています。通知をテーピングすると、特定のページが開きます。XamarinのフォームPushAsyncが空白のページを開く

私はAndroid 5.1で試しましたが、通知をタップすると最初にページが開き、その直後に何も表示されず、何も表示されません。

私はAndroid上でメッセージを受信すると

は、私は次の手順を実行します: ここに

が私のコードである

Intent intent = new Intent(this, typeof(MainActivity)); 
intent.PutExtra("key", "message"); 
PendingIntent pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot); 

Notification notif = new Notification.Builder(this) 
         .SetSmallIcon(Resource.Drawable.icon) 
         .SetContentTitle("Alert") 
         .SetContentText("alert message") 
         .SetAutoCancel(true) 
         .SetDefaults(NotificationDefaults.Sound | NotificationDefaults.Vibrate) 
         .SetContentIntent(pendingIntent) 
         .SetPriority((int)NotificationPriority.High) 
         .Build(); 

NotificationManager notificationManager = (NotificationManager)GetSystemService(Context.NotificationService); 
notificationManager.Notify(0, notif); 

をテープで固定する場合には、次のことを行いMainActivityを開きます

public DataPage() 
{ 
    MessagingCenter.Subscribe<Data>(this, "Show data", (sender) => 
    { 
     await Navigation.PushAsync(new DataDetail(sender)); 
    }); 
} 

これが正常に動作しない理由を私は本当に理解していない... :

protected override void OnCreate(Bundle bundle) 
{ 
    TabLayoutResource = Resource.Layout.Tabbar; 
    ToolbarResource = Resource.Layout.Toolbar; 

    base.OnCreate(bundle); 
    global::Xamarin.Forms.Forms.Init(this, bundle); 
    if (app == null) 
     app = new App(); 
    LoadApplication(app); 

    // If the user tapped a notification 
    if (Intent.Extras != null) 
    { 
     Data data = JsonConvert.DeserializeObject<Data>(Intent.Extras.GetString("key")); 
     MessagingCenter.Send<Data>(data, "Show data"); 
    } 
} 

は最後に、私はこれを行うデータページ(NavigationPage内部のAppのメインページ、などのセット)を持っています

DataPage(Data data) 
{ 
    await Navigation.PushAsync(new DataDetail(data)); 
} 
:特に私は

await Xamarin.Forms.Application.Current.MainPage.Navigation.PushModalAsync(new NavigationPage(new DataPage(data))); 

を行うと、データページにおける第二のコンストラクタを作成した場合以来、

正常に動作します。 (しかし、私はこれが好きではない、それは非常に...素敵ではないに見える)

答えて

0

私はやっとあなたData、あなたのDataDetail、あなたのDataPageとあなたのMainPage間の接続を理解することができます。私の側で

は、私はDataはあなたのコードData data = JsonConvert.DeserializeObject<Data>(Intent.Extras.GetString("key"));に基づいてデータモデルに似ていると思うが、このクラスの中、あなたはコードawait Navigation.PushAsync(new DataDetail(data));、どここのNavigationから来るのでしょうか?

MainPageにはNavigationPageが表示されており、通知をクリックするとDataPageに移動したいと思います。もしそうなら、Notificationの部分に問題はありません。

あなたDetailPage内のデータを表示するには、次の例のパラメータを持つコンストラクタを作成することができます。

public partial class DataPage : ContentPage 
{ 
    public DataPage() 
    { 
     InitializeComponent(); 
    } 

    public DataPage(int count) 
    { 
     InitializeComponent(); 
     //set the data to the UI 
     label.Text = "This is Count: " + count; 
    } 
} 

あなたはMainPageNavigationのための単一のインスタンスを作成することができますので、それはDataクラスで使用することができます:

public static INavigation Navi; 

public MainPage() 
{ 
    InitializeComponent(); 
    Navi = this.Navigation; 
} 

それから私のDataクラスには、次のように簡単です:

public class Data 
{ 
    public Data() 
    { 
     MessagingCenter.Subscribe<Data>(this, "show data", (sender) => 
     { 
      MainPage.Navi.PushAsync(new DataPage(this.Count)); 
     }); 
    } 

    public int Count { get; set; } 
} 
MainActivityで最後に

protected override void OnCreate(Bundle bundle) 
{ 
    TabLayoutResource = Resource.Layout.Tabbar; 
    ToolbarResource = Resource.Layout.Toolbar; 

    base.OnCreate(bundle); 

    global::Xamarin.Forms.Forms.Init(this, bundle); 
    LoadApplication(new App()); 

    if (Intent.Extras != null) 
    { 
     int count = Intent.Extras.GetInt("count", -1); 
     var data = new Data() { Count = count }; 
     MessagingCenter.Send<Data>(data, "show data"); 
    } 
} 

あなたが必要としてあなたがDataクラスを変更することができます。以下は、私のデモのレンダリング画像です:

enter image description here

更新:

我々の議論をもとに、あなたのメッセージは、直接このDataPageをラップ、PCLに続いAppクラスで、DataPageに送られますNavigationPageMainPage = new NavigationPage(new DataPage());。私たちは、パラメータとDataDetailでインストラクターを作成する必要があります。もちろん、

public DataPage() 
{ 
    InitializeComponent(); 
    MessagingCenter.Subscribe<DataPage, Data>(this, "show data", (sender, arg) => 
    { 
     Navigation.PushAsync(new DataDetail(arg)); 
    }); 
} 

if (Intent.Extras != null) 
{ 
    int count = Intent.Extras.GetInt("count", -1); 
    var data = new Data() { Count = count }; //fake data, change it to your data 

    var navipage = App.Current.MainPage as NavigationPage; 
    var datapage = navipage.CurrentPage as DataPage; 
    MessagingCenter.Send<DataPage, Data>(datapage, "show data", data); 
} 

そしてDataPage中:

public DataDetail(Data data) 
{ 
    InitializeComponent(); 
} 
+0

ああ申し訳ありませんが、私はタイプミスをしました。 ..メッセージングセンターのメッセージ "ショーデータ"を購読するクラスは、プロジェクトのメインページであるDataPageです。 コンストラクタでタイプミスをしましたが、それは です。 public DataPage() { MessagingCenter.Subscribe(...); } そして、私のデータページはこの 公共のApp(){ ... メインページ=新しいNavigationPage(新しいデータページ)のようにNavigationPageに包まれ、メインページであることから、 .... } これは表示されているようですが、それでも正常に動作しません。 – Alhyoss

+0

私のMainPageは、NavigationPageでラップされたDataPageであり、ListViewがデータのリストにバインドされていますそれは問題に無関係と思われます)。次に、DataDetailは、モデルクラスと同じように、特定のデータを詳細に表示するページです。 したがって、DataPage()内のナビゲーションは私には正当だと思われます。 – Alhyoss

+0

@imim、そうですが、あなたのメッセンジャーセンターは 'Data'クラスにメッセージを送りました。そのクラスでは、' Navigation'プロパティがないはずです。それで、私は 'MainPage'で' Navigation'の一例を使用しました。したがって、あなたの要件は、通知からデータを取得し、あなたの 'DataPage'に表示することです、あなたのデータページは' NavigationPage'のルートページです、そうですか? 'DataDetail'はここでは無関係ですか? –

0
このような MainAcitvity送信メッセージで

私はついにこの問題を解決しました。 これは、MainActivityで静的なApp変数を作成して一度だけ作成するという事実に起因すると思われます。

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 
{ 
    static App app; 

    protected override void OnCreate(Bundle bundle) 
    { 
     ... 
     if(app == null) 
      app = new App(); 
     ... 
    } 
} 

そうしないと、アプリケーションインスタンスのCurrent.Propertiesがリセットされたためです。 Current.Propertiesを保存するためにCurrent.SavePropertiesAsync()を呼び出すので、MainActivityでAppの静的インスタンスを削除できます。これは空白ページの問題を解決しました。

しかし、これは別の問題を引き起こしました。通知をタップすると、最初は正しく動作しましたが、要求されたページが複数回開かれました(2回目の通知は2ページ開き、3回目の通知は3回...)。なぜそれがそれをしたのかわかりませんが、MessagingCenterによって引き起こされたようです。だから私はMessagingCenterの一部を除去し、単にMainActivityでこれをやった:

if (Intent.Extras != null) 
{ 
    Data data = JsonConvert.DeserializeObject<Data>(Intent.Extras.GetString("key")); 
    DataPage currentPage = (DataPage)((NavigationPage)App.Current.MainPage).CurrentPage; 
    currentPage.OpenDataDetails(data); 
} 

そしてデータページに、私はこの機能

public async void OpenDataDetails(Data data) 
{ 
    await Navigation.PushAsync(new DataDetail(data)); 
} 

予想通りこれは、作業を行うを持っているので、今、私は幸せです。

しかし、私はMainActivityに静的なアプリケーションインスタンスを持っていたとき、それは空白のページを開いた理由、またそれがMessagingCenterで複数のページを開いた理由はまだ、私は理解していない...

関連する問題