2017-02-28 1 views
0

J'ai un simple ActionBar avec 3 onglets attachés. Quand un onglet est cliqué, le fragment est gonflé et la vue montre. L'onglet en cours de clic est déclenché à l'aide d'un événement. Initialement, le premier fragment est gonflé, mais les autres répondent et gonflent si vous cliquez dessus.L'ICommand ne se déclenche pas toujours lorsque l'onglet est sélectionné

Si je change l'événement en cours en ICommand, seul le dernier fragment est gonflé et si je clique sur le premier onglet, celui-ci et le dernier sont gonflés. Jamais la seconde.

Mon code est ce

ICommand TabClicked 
    { 
     get 
     { 
      return new RelayCommand(() => 
      { 
       tab.TabSelected += (object sender, ActionBar.TabEventArgs e) => TabOnTabSelected(sender, e); 
      }); 
     } 
    } 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     SetContentView(Resource.Layout.Main); 

     ActionBar.NavigationMode = ActionBarNavigationMode.Tabs; 

     fragments.Add(new TODFragment()); 
     fragments.Add(new ConditionsFragment()); 
     fragments.Add(new ResultsFragment()); 

     AddTabToActionBar("Time", Resource.Drawable.crucifix_colour); 
     AddTabToActionBar("Conditions", Resource.Drawable.weather_colour); 
     AddTabToActionBar("Results", Resource.Drawable.tod_colour); 
    } 

    void AddTabToActionBar(string text, int iconResourceId) 
    { 
     tab = ActionBar.NewTab().SetTag(text).SetText(text).SetIcon(iconResourceId); 

     /* uncomment and comment out one of the two below to see the difference in operation */ 

     tab.TabSelected += TabOnTabSelected; 
     //tab.SetCommand<ActionBar.TabEventArgs>("TabSelected", TabClicked); 
     ActionBar.AddTab(tab); 
    } 

    void TabOnTabSelected(object sender, ActionBar.TabEventArgs tabEventArgs) 
    { 
     var tabNo = sender as ActionBar.Tab; 
     var frag = fragments[tabNo.Position]; 
     tabEventArgs.FragmentTransaction.Replace(Resource.Id.frameLayout1, frag); 
    } 

Suis-je manque quelque chose ici fondamental dans la différence entre ICommands et événements ou est-ce autre chose?

J'utilise Xam.Android et MVVMLight

Répondre

0

Je trouve la réponse. Lorsque je crée la classe partielle je définir les objets de l'interface utilisateur comme celui-ci (ou quelque chose comme celui-ci au moins)

EditText myEditText; 
EditText MyEditText = myEditText ?? (view.FindViewById<EditText>(Resources.Id.myEdit); 

Cela est bien, mais cela ne signifie qu'une fois défini, il ne soit pas redéfinie.

Ce n'est pas un problème si l'interface utilisateur ne change pas vraiment, mais chaque fois qu'une action est pressée, le fragment est actualisé. Le seul problème est que l'Id ne change pas car myEditText n'est pas nul. La réponse est ajouter une méthode dans le code de définition d'interface utilisateur qui annule les objets puis dans le code principal, lorsque l'interface utilisateur disparaît, appelez la méthode nulling. Tout fonctionne alors