2017-06-29 5 views
0

J'ai Xamarin.Android todo liste application mobile en utilisant Prism.Xamarin.Android application reprise par l'intention de raccourci - Maître et détail doit être défini avant d'ajouter MasterDetailPage à un conteneur

Le problème est:

  • Dans le système Android, je peux créer un raccourci pour ouvrir la liste spécifique dans app.
  • Quand j'ouvre l'application et appuyez sur le bouton d'accueil, il reste sur fond (qu'est à dire ok)
  • Quand je lance alors l'application de raccourci sur le bureau, il ouvre activité android et quand je crée de nouveaux tout PrismApplication ( LoadApplication(new App());) est en cours d'exécution, mais après création viewmodel pour la vue, l'application utilise toujours ancien viewmodel de avant.

J'ai fait ce workaroud et je l'utilise même instance de PrismApplication:

static App xamApp; 

protected override void OnCreate(Bundle bundle) 
{ 
    if (xamApp == null) 
    { 
     Forms.Init(this, bundle); 
     xamApp = new App(); 
    } 

    LoadApplication(xamApp); 
    xamApp.Redirect(Intent.GetStringExtra("ListID")); 
} 

Maintenant, problème réoriente. Ce code:

public void Redirect(string listId) 
{ 
    NavigationService.NavigateAsync($"MainPage/MainNavigationPage/TodoList?id={listId}", animated: false); 
} 

conduit à l'erreur:

System.InvalidOperationException: Master and Detail must be set before adding MasterDetailPage to a container.

Prism devrait prendre soin de la fixation de détail en MasterDetailPage par le "todolist" de NavigateAsync uri.

Est-ce que quelqu'un sait quel peut être le problème ici?

Répondre

1

Alors j'ai finalement réussi à le faire fonctionner.

  • D'abord, j'utilisé LaunchMode = LaunchMode.SingleTask dans mon ActivityAttribute de MainActivity

    [Activité (label = "..", LaunchMode = LaunchMode.SingleTask, Icône = "@ drawable/icône", thème = "style @/Maintheme", MainLauncher = true]

    public class MainActivity: FormsAppCompatActivity

  • Puis je méthode OnNewIntent de FormsAppCompatActivity donc après l'application est backgroud, que cet événement est lancé:

protected override void OnNewIntent(Intent intent) 
{ 
    var listId = intent.GetStringExtra("ListID"); 
    ((App)App.Current).Redirect(listId); 
}
  • Maintenant, même $"MainNavigationPage/TodoList?id={listId}" fonctionne
0

D'après les informations que vous avez fournies, je suppose que lorsque l'application est à nouveau lancée, elle est déjà en cours d'exécution, votre page MasterDetail précédente est déjà dans la pile. Dans votre méthode de réinitialisation, vous voulez réinitialiser votre pile de navigation au nouvel uri passant dans le paramètre. Dans ce cas, vous devez utiliser un uri absolu. Cela signifie essayer d'ajouter un préfixe "/" à votre uri. Donc, quelque chose comme ça:

public void Redirect(string listId) 
{ 
    NavigationService.NavigateAsync($"/MainPage/MainNavigationPage/TodoList?id={listId}", animated: false); 
} 
+0

Oui, l'application est déjà en cours d'exécution en arrière-plan (le problème est apparu uniquement si l'application était déjà en cours d'exécution). J'ai essayé cet URI absolu et le résultat était le même. Le problème était que j'utilisais LaunchMode par défaut donc peut-être qu'une nouvelle instance de l'application a été créée mais en quelque sorte en utilisant l'ancienne PrismApplication, même quand j'ai créé un nouveau: 'LoadApplication (new App());'. Je suis nouveau au développement android donc je ne suis pas exactement sûr comment (ou si) cela pourrait se produire. –