2017-02-27 96 views
0

海蘭大家,片段Xamarin的Android

我試圖取代片段,但它不工作...我有一個活動,這個活動裏面我有兩個按鈕和一個的LinearLayout,我想取代許多片段在LinearLayout中使用按鈕Next和Previuos,第一個片段工作,但第二個不起作用。

有人可以解釋我該怎麼做?

活動

ing System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Android.Support.V7.App; 
using Uer.Fragments.FragmentsRegister; 

namespace Uer 
{ 
    [Activity(Label = "Register", Theme = "@style/NoActionBar")] 

    public class RegisterActivity : AppCompatActivity 
    { 

     private LinearLayout lnlContainerRegister; 
     private Button btnNext; 

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

      // Create your application here 
      SetContentView(Resource.Layout.RegisterActivity); 

      lnlContainerRegister = FindViewById<LinearLayout>(Resource.Id.lnlContainerRegister); 
      btnNext = FindViewById<Button>(Resource.Id.btnNext); 

      cpfFragment(); 

      btnNext.Click += BtnNext_Click; 
     } 

     private void BtnNext_Click(object sender, EventArgs e) 
     { 
      emailFragment(); 
     } 

     void cpfFragment() 
     { 

      var transaction = SupportFragmentManager.BeginTransaction(); 
      transaction.Add(Resource.Id.lnlContainerRegister, new CPF(), "CPF"); 
      transaction.Commit(); 

     } 

     void emailFragment() 
     { 
      var transaction = SupportFragmentManager.BeginTransaction(); 
      transaction.Add(Resource.Id.lnlContainerRegister, new Email(), "Email"); 
      transaction.Commit(); 
     } 
    } 
} 

CPF片段

sing System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Util; 
using Android.Views; 
using Android.Widget; 
using Android.Support.V4.App; 

namespace Uer.Fragments.FragmentsRegister 
{ 
    public class CPF : Fragment 
    { 
     public override void OnCreate(Bundle savedInstanceState) 
     { 
      base.OnCreate(savedInstanceState); 

      // Create your fragment here 
     } 

     public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 
      // Use this to return your custom view for this Fragment 
      View view = inflater.Inflate(Resource.Layout.CPFFragment, container, false); 

      return view; 
     } 
    } 
} 

電子郵件片段

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Util; 
using Android.Views; 
using Android.Widget; 
using Android.Support.V4.App; 

namespace Uer.Fragments.FragmentsRegister 
{ 
    public class Email : Fragment 
    { 
     public override void OnCreate(Bundle savedInstanceState) 
     { 
      base.OnCreate(savedInstanceState); 

      // Create your fragment here 
     } 

     public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 
      // Use this to return your custom view for this Fragment 
      View view = inflater.Inflate(Resource.Layout.EmailFragment, container, false); 

      return view; 
     } 
    } 
} 

PS:該作品cpfFragment normaly!

+0

你有什麼錯誤? –

+0

沒什麼,只是不工作:/ –

回答

1

嘗試將FrameLayout添加到您的Activity的XML。

<FrameLayout 
     android:id="@+id/myFrameLayout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

然後,使用supportFragmentManager的方法Replace()而不是方法Add()。

你會得到這樣的事情:

void cpfFragment() 
     { 

      var transaction = SupportFragmentManager.BeginTransaction(); 
      transaction.Replace(Resource.Id.myFrameLayout, new CPF(), "CPF"); 
      transaction.Commit(); //or CommitAllowingStateLoss 

     } 

有了這個代碼,您的活動的FrameLayout將包含片段CPF的視圖。

然後,您將不得不爲您的電子郵件片段調用相同的代碼,並且將清理FrameLayout,並將電子郵件片段的視圖添加到其中。

void emailFragment() 
    { 
     var transaction = SupportFragmentManager.BeginTransaction(); 
     transaction.Replace(Resource.Id.myFrameLayout, new Email(), "Email"); 
     transaction.Commit(); //or CommitAllowingStateLoss 
    } 

告訴我,如果它的工作原理:)

編輯:回答這個問題的評論

你必須創建一個接口,你的活動應該實現它:

public interface IChangeFragment 
{ 
    void emailFragment(); 
    void cpfFragment(); 
} 

public class RegisterActivity : AppCompatActivity, IChangeFragment 
{ 
    //... 

    public void emailFragment() 
    { 
     //... 
    } 

    public void cpfFragment() 
    { 
     //... 
    } 
} 

然後,你的片段必須使用IChangeFragment類型的回調函數。回調將在片段的OnAttach方法進行估值,你將能夠調用您的活動的方法,從您的片段:

public class CPF : Fragment 
{ 
     private IChangeFragment m_callBack; 

     public override void OnAttach(Activity activity) 
     { 
      base.OnAttach(activity); 

      try 
      { 
       m_callBack = (IChangeFragment)activity; 
      } 
      catch (ClassCastException) 
      { 
       throw new ClassCastException(activity.ToString() + " must implement IChangeFragment"); 
      } 
     } 

     private void OnButtonClicked(object sender, EventArgs e) 
     { 
      m_callBack.emailFragment(); 
     } 
} 

注意,用這種方法,使用這些片段的任何活動將必須實現接口IChangeFragment。如果沒有,你將得到一個ClassCastException。

+0

男人,非常感謝你...它只是使用替換!但是...如果我想用另一個片段內的按鈕調用Fragment? –

+0

再次感謝! –