2017-02-27 93 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

再次感谢! –