Android Java实现:HomeFragment向EmptyActivity内OverviewFragment传参
跨Activity的Fragment数据传递实现方案
两个Fragment分属不同Activity时,不需要直接建立通信,完整的传值链路为:HomeFragment所在的页面通过Intent将数据传给承载OverviewFragment的EmptyActivity,再由EmptyActivity将数据转发给内部的OverviewFragment即可。
核心实现步骤
- 点击列表项时,将选中项标题通过Intent extra传递给EmptyActivity
- EmptyActivity启动后,从自身Intent中取出携带的标题值
- 初始化OverviewFragment时,通过
setArguments()将标题值绑定到Fragment实例 - OverviewFragment从自身的Arguments参数中取值,完成页面展示
现有代码问题修正
你当前的代码存在两个关键错误:
- OverviewFragment中调用的
Intent.getIntent("Restaurant")并非安卓系统API,既无法编译通过,也没有获取数据的实际逻辑 - 让Fragment直接读取宿主Activity的Intent存在生命周期隐患,在屏幕旋转等配置变更导致Fragment重建时,容易出现空指针、数据丢失的问题
1. 修改RecyclerView适配器的点击传值逻辑
确保传入Intent的是选中项的实际标题字符串,而非列表位置id:
holder.v.setOnClickListener(v -> { // 取出当前选中位置的餐厅标题 String selectedTitle = list.get(position).getName(); Intent i = new Intent(v.getContext(), EmptyActivity.class); // 用固定常量作为key,避免硬编码拼写错误 i.putExtra("EXTRA_SELECTED_TITLE", selectedTitle); v.getContext().startActivity(i); });
2. 修改EmptyActivity的Fragment加载逻辑
作为承载OverviewFragment的宿主,EmptyActivity负责完成数据的中转:
public class EmptyActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_empty); // 取出Home页面传递的标题值 String receivedTitle = getIntent().getStringExtra("EXTRA_SELECTED_TITLE"); // 给OverviewFragment准备传值Bundle Bundle args = new Bundle(); args.putString("FRAGMENT_TITLE_KEY", receivedTitle); // 初始化Fragment并绑定传值参数 OverviewFragment fragment = new OverviewFragment(); fragment.setArguments(args); // 将Fragment加载到布局容器中 getSupportFragmentManager().beginTransaction() .replace(R.id.fragment_container, fragment) .commit(); } }
注意:通过setArguments()传递参数是安卓官方推荐的Fragment传值方式,这种方式可以在Fragment因配置变更重建时自动保留传递的数据,避免生命周期异常。
3. 修改OverviewFragment的取值逻辑
删除原有的错误Intent调用代码,从自身绑定的Arguments中读取数据:
public class OverviewFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_over_view, container, false); TextView singletitle = view.findViewById(R.id.single); // 从Arguments中取出传递的标题并展示 if (getArguments() != null) { String title = getArguments().getString("FRAGMENT_TITLE_KEY"); singletitle.setText(title); } return view; } }
内容的提问来源于stack exchange,提问作者Madhanavel
相关产品推荐
相关产品推荐

