2012-08-14 3 views
0

두 개의 단편과 하나의 활동이 있습니다. ChatFragment 및 UserListFragment입니다. ChatActivity 내가 foolowing 코드를 작성했습니다 시작 활동안드로이드 용 탭 모노 사이를 전환 할 수 없습니다.

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(); 
     } 

그것은 내가 열려면 ChatFragment 아무것도가없는 chatt 창 새 탭에서 열립니다됩니다 사용자의 하나를 클릭하면 UserFragment 를 사용하여 가능한 사용자의 목록을 표시합니다 새 창 나는 액션 바

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

에 탭을 추가하고 내가 사용하고 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()); 
     } 
    } 

OnTabSelected 및 Deselected에 작성해야하는 코드는 무엇입니까? 작업 표시 줄에서 탭 사이를 전환 할 수 없습니다. 누구든지이 문제를 해결할 수 있도록 도와주십시오.

+0

나는 스스로 파고 들었습니다. ......... –

+0

또한이 공식 자습서를 확인하십시오 : http://docs.xamarin.com/Android/Guides/Platform_Features/Introduction_to_Ice_Cream_Sandwich#Action_Bar_Tabs – Ivozor

답변

1

사실 (API 레벨 14로 작업하기가 쉽습니다.) 청취자 클래스는 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); 
    } 

안드로이드 튜토리얼에서 보여준대로 탭 전환이 제대로 작동하지 않는다고 생각하여 문제가 생겼습니다. 사실 탭보기를 업데이트 할 때 실수를 저 지르며 잘못된 방향으로 솔루션을 검색하는 데 몇 시간의 시간을 낭비했습니다. 탭에 대한 stackoverflow에 대한 다른 질문을 보았습니다. 비슷한 상황에 있다고 생각합니다 .--).

EDIT : 실제로 FragmentManager에 조각이 유지되어 뷰가 제거되면 탭을 전환 할 때 안드로이드 3.2 attach/detach가 더 좋은 아이디어 인 것으로 보입니다. 이전 방법은 다음과 같습니다

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이 주제에 대해 매우 흥미 롭다.

관련 문제