2012-08-14 1 views
0

J'ai deux fragments et une activité. ChatFragment et UserListFragment. ChatActivity est une activité de démarrage où j'ai écrit code foolowingNOt capable de basculer entre les onglets mono pour android

protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 
      SetContentView(Resource.Layout.QChatLayout); 

      var newFragment = new UserFragment(this, this); 
      var ft = FragmentManager.BeginTransaction(); 
      ft.Add(Resource.Id.Frame_container, newFragment); 
      ActionBar.NavigationMode = ActionBarNavigationMode.Tabs; 
      var homeTab = ActionBar.NewTab(); 

      homeTab.SetTabListener(
       new TabListener<UserFragment>(newFragment)); 
      homeTab.SetText("Users"); 

      // Add the new tab to the action bar 
      ActionBar.AddTab(homeTab); 

      ft.Commit(); 
     } 

Il affiche la liste des utilisateurs disponibles à l'aide UserFragment Quand je clique sur l'un des utilisateurs de la fenêtre de chatt s'ouvre dans un nouvel onglet qui n'est ChatFragment Pour ouvrir nouvelle fenêtre J'ajoute onglet ActionBar

User user = GetUserByName(userName); 
       ChatFragment chatFragment = null; 
       Fragment fragment = FragmentManager.FindFragmentByTag(user.Name); 
       var ft = FragmentManager.BeginTransaction(); 
       if (fragment == null) 
       { 
        chatFragment = new ChatFragment(context, activity); 
        chatFragment.User = user; 
        chatFragment.CurrentUser = Global.Host.Username; 
        Global.ChatWindows.Add(chatFragment); 
        ft.SetBreadCrumbTitle(user.Name); 
        ft.Add(Resource.Id.Frame_container, chatFragment, user.Name); 
        var homeTab = this.activity.ActionBar.NewTab(); 

     homeTab.SetTabListener(
      new TabListener<ChatFragment>(fragment)); 
     homeTab.SetIcon(Resource.Drawable.QChatOffline); 
     homeTab.SetText(userName); 

     // Add the new tab to the action bar 
     this.activity.ActionBar.AddTab(homeTab);     } 
       else 
       { 
        chatFragment = (ChatFragment)fragment; 
       } 


       ft.Commit(); 
       chatFragment.ShowMessage(String.Format("{0} is {1}.", user.Name, m_chatWindowManager.GetStatusText(user.Status)), MessageType.Status); 

j'ai utilisé classe tablistner:

public class TabListener<T> : Java.Lang.Object, ActionBar.ITabListener 
     where T : Fragment, new() 
    { 
     private T _fragment; 

     /// <summary> 
     /// initializes a new instance of the tab listener 
     /// </summary> 
     public TabListener() 
     { 
      _fragment = new T(); 
     } 

     /// <summary> 
     /// Initializes a new instance of the tab listener 
     /// </summary> 
     /// <param name="fragment"></param> 
     public TabListener(T fragment) 
     { 
      _fragment = fragment; 
     } 

     /// <summary> 
     /// Handles the reselection of the tab 
     /// </summary> 
     /// <param name="tab"></param> 
     /// <param name="ft"></param> 
     public void OnTabReselected(ActionBar.Tab tab, FragmentTransaction ft) 
     { 

     } 

     /// <summary> 
     /// Adds the fragment when the tab was selected 
     /// </summary> 
     /// <param name="tab"></param> 
     /// <param name="ft"></param> 
     public void OnTabSelected(ActionBar.Tab tab, FragmentTransaction ft) 
     { 
      //ft.Add(Resource.Id.Frame_container, _fragment, typeof(T).FullName); 
      //int index = Global.ChatWindows.FindIndex(c => c.User.Name == tab.Tag.ToString()); 
      //Activity.ActionBar.SelectTab(Activity.ActionBar.GetTabAt(index + 1)); 
      //ft.Show(_fragment); 
      //tab.Select(); 
      //tab.Notify(); 
     } 

     /// <summary> 
     /// Removes the fragment when the tab was deselected 
     /// </summary> 
     /// <param name="tab"></param> 
     /// <param name="ft"></param> 
     public void OnTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) 
     { 
      //ft.Remove(_fragment); 
      //ft.AddToBackStack(tab.Tag.ToString()); 
     } 
    } 

quel code je devrais écrire dans OnTabSelected et Deselected. Je ne peux pas basculer entre les onglets dans la barre d'action. Quelqu'un peut-il s'il vous plaît aider à régler ce problème.

+0

Je l'ai fait après auto-creuser ... –

+0

En outre, consultez ce tutoriel officiel: http://docs.xamarin.com/Android/Guides/Platform_Features/Introduction_to_Ice_Cream_Sandwich#Action_Bar_Tabs – Ivozor

Répondre

1

Les choses sont en fait faciles (je travaille avec le niveau 14 de l'API) et je me souviens que c'est ce que j'ai appelé la classe d'écoute SimpleTabListener.

public void OnTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) 
    { 
     fragmentTransaction.Add(Resource.Id.fragment_container, fragment, typeof(T).Name); 
    } 

    public void OnTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) 
    { 
     fragmentTransaction.Remove(fragment); 
    } 

Je suis intéressé par votre problème parce que je pensais que l'onglet commutation n'a pas fonctionné comme tutoriel droite android montre. En fait, j'ai fait une erreur lors de la mise à jour des onglets et perdu plusieurs heures à chercher une solution dans la mauvaise direction. J'ai vu vos autres questions sur stackoverflow à propos des onglets, et je pense que vous étiez dans une situation similaire ;-).

EDIT: En fait, il semble que d'android 3.2 attach/detach est une meilleure idée lors du changement de tabulation que le fragment est conservé dans FragmentManager et la vue supprimée. Les méthodes précédentes sont alors:

public void OnTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) 
    { 
     // Allows the view to be refreshed 
     fragmentTransaction.Detach(fragment); 
     fragmentTransaction.Attach(fragment);   
    } 

    public void OnTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) 
    { 
     if (fragment == null) 
     { 
      fragment = Fragment.Instantiate(context, typeof(T).Namespace.ToLower() + "." + typeof(T).Name); 
      fragmentTransaction.Add(Resource.Id.fragment_container, fragment); 
     } 
     else 
     { 
      fragmentTransaction.Attach(fragment); 
     } 
    } 

    public void OnTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) 
    { 
     if (fragment != null) 
     { 
      fragmentTransaction.Detach(fragment); 
     } 
    } 

This blog post est très intéressant sur le sujet.

Questions connexes