1、Activity中使用Fragment
一般而言,会在activity
中添加一个加载fragment
的方法。通过点击菜单的按钮,加载不同的fragment
。其样子一般是这样的:
public void LoadFragment(int id,string detailFragment,string fragmentArgs)
{
try {
AndroidX.Fragment.App.Fragment fragment = null;
switch (id)
{
case Resource.Id.menu_workspace:
fragment = WorkspaceMainFragment.NewInstance(id);//传入某个/些参数
break;
case Resource.Id.menu_hospital:
fragment = HospitalFragment.NewInstance();
break;
case Resource.Id.menu_mine:
fragment = LoginFragment.NewInstance();
break;
default:
break;
}
if (fragment == null)
return;
SupportFragmentManager.BeginTransaction()
.Replace(Resource.Id.content_frame, fragment)
.AddToBackStack(null) //支持回退
.Commit();
}
catch(Exception ex)
{
Toast.MakeText(this, "发生异常!异常信息如下:LoadFragment" + ex.Message, ToastLength.Long).Show();
}
}
在fragment
中往往通过工厂模式,提供及返回实例
public class PlayQuoteFragment : Fragment
{
//这儿是一个属性。通过Arguments获取数据
public int PlayId => Arguments.GetInt("current_play_id", 0);
//这儿是通过工厂模式,提供fragment的实例
public static PlayQuoteFragment NewInstance(int playId)
{
//Bundle其实放在这儿,或者放到activity的LoadFragment方法中都是可以的
//但放在这儿会更好。若放在activity中,则需要命名不同的Bundle
//放在这儿,可以实现对外,只是一个工厂方法和参数即可。外界不需要知道内部的具体事务
var bundle = new Bundle();
bundle.PutInt("current_play_id", playId);
return new PlayQuoteFragment {Arguments = bundle};
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
if (container == null)
{
return null;
}
var textView = new TextView(Activity);
var padding = Convert.ToInt32(TypedValue.ApplyDimension(ComplexUnitType.Dip, 4, Activity.Resources.DisplayMetrics));
textView.SetPadding(padding, padding, padding, padding);
textView.TextSize = 24;
textView.Text = Shakespeare.Dialogue[PlayId];
var scroller = new ScrollView(Activity);
scroller.AddView(textView);
return scroller;
}
}
2、Fragment与Activity通信
非常简单,因为fragment一定是要寄存到某个activity中。因此直接使用如下代码:
var myActivity = (MyActivity) this.Activity;
myActivity.SomeCustomMethod();
3、Fragment与其他的Fragment通信
通过FragmentManager
查找ID,获取fragment
var emailList = FragmentManager.FindFragmentById<EmailListFragment>(Resource.Id.email_list_fragment);
emailList.SomeCustomMethod(parameter1, parameter2);
本文含有隐藏内容,请 开通VIP 后查看