2013-09-23 84 views
1

我不知道爲什麼它不能正常工作,但我做錯了什麼。如果我明確地設置TextView並且不使用LayoutInflater的膨脹方法,它工作正常。它只是關閉我的應用程序,當我運行它,當我切換到測試選項卡時,它只會在輸出窗口中沒有錯誤的情況下崩潰。使用ActionBar選項卡在片段中加載資源視圖

public class MyProfileActivity : Activity 
{ 
     protected override void OnCreate (Bundle bundle) 
    { 
     base.OnCreate (bundle); 

     ActionBar actionBar = ActionBar; 
     actionBar.NavigationMode = ActionBarNavigationMode.Tabs; 
     actionBar.SetDisplayShowTitleEnabled (false); 

     ActionBar.Tab tab = actionBar.NewTab(); 
     tab.SetText ("Home"); 
     // tab.SetIcon (Resource.Drawable.tab_home); 
     tab.SetTabListener(new TabListener<HomeFragment>(this, "home")); 
     actionBar.AddTab (tab); 

     tab = actionBar.NewTab(); 
     tab.SetText("Terms"); 
     // tab.SetIcon(Resource.Drawable.tab_terms); 
     tab.SetTabListener (new TabListener<TermsFragment> (this, "terms")); 
     actionBar.AddTab (tab); 


     tab = actionBar.NewTab(); 
     tab.SetText("test"); 
     // tab.SetIcon(Resource.Drawable.tab_terms); 
     tab.SetTabListener(new TabListener<TestFragment>(this, "test")); 
     actionBar.AddTab(tab); 
    } 
} 

片段

public class TestFragment : Fragment 
    { 
     private View _fragmentView; 

     public override void OnCreate(Bundle savedInstanceState) 
     { 
      base.OnCreate(savedInstanceState); 

      // Create your fragment here 
     } 

     public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 

      _fragmentView = inflater.Inflate(Resource.Layout.Tabs, container); 
      return _fragmentView; 
     } 
    } 

#region HomeFragment 
public class HomeFragment : Fragment 
{ 
    public HomeFragment() : base() {} 

    public override View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     TextView tv = new TextView (Activity); 
     tv.Text = "Home"; 

     return tv; 
    } 
} 
#endregion 

#region TermsFragment 
public class TermsFragment : Fragment 
{ 
    public TermsFragment() : base() {} 

    public override View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     TextView tv = new TextView (Activity); 
     tv.Text = "Terms"; 

     return tv; 
    } 
} 
#endregion 

TabListener

public class TabListener<T> : Java.Lang.Object, ActionBar.ITabListener where T : Fragment 
    { 
     #region Members 
     private Fragment m_fragment; 
     private readonly Activity m_activity; 
     private readonly string m_tag; 
     private readonly T m_fragmentType; 
     #endregion 

     #region Constructor 
     public TabListener(Activity activity, String tag) 
     { 

       // The Activity is our host Activity and provides the Context. 
       // The type T and the tag will be used to instantiate the fragment. 
       // m_fragment will hold the instance for reuse after it is first created. 
       m_activity = activity; 
       m_tag = tag; 
      } 
      #endregion 

      #region ITabListener implementation 
      public void OnTabSelected(ActionBar.Tab tab, FragmentTransaction ft) 
      { 
       // Instantiate the reference and add it to the container, 
       // or attach it if it has already been created 
       if (m_fragment == null) 
       { 
        m_fragment = Fragment.Instantiate(m_activity, Java.Lang.Class.FromType(typeof(T)).Name); 
        ft.Add(global::Android.Resource.Id.Content, m_fragment, m_tag); 
       } 
       else 
       { 
        ft.Show(m_fragment); 
       } 
      } 

      public void OnTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) 
      { 
       if (m_fragment != null) 
       { 
        ft.Hide(m_fragment); 
       } 
      } 

      public void OnTabReselected(ActionBar.Tab tab, FragmentTransaction ft) 
      { 
       // User selected the already selected tab. Usually do nothing. 
      } 
      #endregion 

     public class TestFragment : Fragment 
     { 
      private View _fragmentView; 

      public override void OnCreate(Bundle savedInstanceState) 
      { 
       base.OnCreate(savedInstanceState); 

       // Create your fragment here 
      } 

      public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
      { 

       _fragmentView = inflater.Inflate(Resource.Layout.Tabs, container); 
       return _fragmentView; 
      } 
     } 
    } 
+0

它是如何失敗。請發佈堆棧跟蹤並更好地描述您正在嘗試的內容。只是傾銷你的所有代碼都不會使任何人受益。 – Cheesebaron

+0

你能讀嗎?你仍然有可能通過logcat獲取信息! – Cheesebaron

+1

對不起,我會包括一些東西。你可以給我下一個評論嗎?它使用Xamarin插件在Visual Studio 2012下。我沒有logcat,因爲我沒有使用android studio。 Xamarin意識到VS中的調試體驗。 –

回答

0

我想與您的代碼使用,並導航到TestFragment時得到了java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

This answer讓我通過對參數attachToRoot提供false來解決這個問題:

_fragmentView = inflater.Inflate(Resource.Layout.TestLayout, container, false); 
相關問題