Xamarin中如何通过SupportFragmentManager从Activity传值给Fragment
Activity通过SupportFragmentManager向V4包Fragment传值实现
Support V4库下的Fragment传值统一通过Bundle绑定参数实现,禁止直接重载Fragment构造方法传参(横竖屏切换、系统内存不足重建Fragment时,构造方法传入的参数会全部丢失)。
具体实现步骤:
- 在自定义Fragment中封装静态实例化方法,统一处理参数绑定逻辑,避免外部直接调用无参构造漏传参数
- Activity侧创建Fragment实例时,将待传递数据存入Bundle,通过
Arguments属性绑定到Fragment实例 - Fragment在
OnCreate生命周期中读取绑定的Bundle参数,即可拿到Activity传递的数据
替换你原有代码的实现示例:
Activity侧代码
// 示例传递两个参数:字符串类型用户ID、整型页码 string passUserId = "u_1001"; int passPage = 3; var trans = SupportFragmentManager.BeginTransaction(); // 不要直接new Fragment(),调用Fragment的静态实例化方法传入参数 MainFragment mainFragment = MainFragment.NewInstance(passUserId, passPage); trans.Add(Resource.Id.FramelayoutMain, mainFragment, "MainFragment"); trans.Commit();
自定义MainFragment侧代码
public class MainFragment : Fragment { // 定义Bundle存取的Key常量,避免硬编码导致的取值错误 private const string KeyUserId = "key_user_id"; private const string KeyPage = "key_page"; // 静态实例化方法,对外暴露传参入口 public static MainFragment NewInstance(string userId, int page) { MainFragment fragment = new MainFragment(); Bundle args = new Bundle(); // 将待传递数据存入Bundle,支持基础数据类型、序列化对象 args.PutString(KeyUserId, userId); args.PutInt(KeyPage, page); fragment.Arguments = args; return fragment; } public override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // 读取Activity传入的参数,先做非空校验 if (Arguments != null) { string getUserId = Arguments.GetString(KeyUserId); int getPage = Arguments.GetInt(KeyPage); // 拿到参数后即可在Fragment逻辑中正常使用 } } }
补充说明:如果是已经添加到Fragment栈的已存在Fragment,可以通过
SupportFragmentManager.FindFragmentByTag("MainFragment")拿到Fragment实例,调用Fragment对外暴露的公共方法传值,注意做好空判断,避免Fragment未初始化或已销毁触发空指针。
内容的提问来源于stack exchange,提问作者David Fridman
相关产品推荐
相关产品推荐

