为了账号安全,请及时绑定邮箱和手机立即绑定

在未附加到 Activity 的 Fragment 中调用 Activity 方法

在未附加到 Activity 的 Fragment 中调用 Activity 方法

白板的微信 2021-05-30 14:33:33
我试图从我的 Fragment 中的 HomeActivity 获取一个与 HomeActivity 无关的值。当我使用selectedWorkout = ((HomeActivity) context).getSelectedWorkout(); 在这种情况下 context = getActivity();我收到一个错误: java.lang.NullPointerException: Attempt to invoke virtual method 'com.pttrackershared.models.Workout com.pttracker.views.screens.fragments.LandingFragment.getSelectedWorkout()' on a null object reference我也尝试做这样的事情:Activity activity = getActivity();   if (activity instanceof HomeActivity) {       HomeActivity myactivity = (HomeActivity) activity;       selectedWorkout = myactivity.getSelectedWorkout();}但是,这根本行不通。我将如何获得这个价值?
查看完整描述

2 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

首先,您的代码崩溃了,因为Fragment没有附加到Activity. 所以一个快速的解决方法是添加一个像这样的空检查:


Activity activity = getActivity();

if (activity != null && activity instanceof HomeActivity) {

       HomeActivity myactivity = (HomeActivity) activity;

       selectedWorkout = myactivity.getSelectedWorkout();

}

也就是说,Activity像这样访问不是一个好习惯,因为它将 Fragment 与特定的Activity. 有几种更好的方法来处理它,例如:


方法一: 使Activity实现成为一个接口SelectedWorkoutProvider,将 getSelectedWorkout() 方法移到那里并强制转换为接口,而不是HomeActivity


方法二: 将选定的锻炼传递给Fragmentvia 参数,如下所示:


Bundle args = new Bundle();

args.putString("selected.workout", getSelectedWorkout());

LandingFragment fragment = new LandingFragment();

fragment.setArguments(args);

然后在Fragment使用中:


getArguments().getString("selected.workout");

以获得价值。


方法三: 使用 将SharedPreferences数据保存Activity在Fragment. 请在此处找到文档SharedPreferences


查看完整回答
反对 回复 2021-06-02
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

另一种方法是使用 EventBus(或其他类似的库)并在选择锻炼时将事件从活动发送到片段


查看完整回答
反对 回复 2021-06-02
  • 2 回答
  • 0 关注
  • 195 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信