我试图从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();
}
但是,那根本不起作用。
我将如何获得这个价值?
答案 0 :(得分:1)
首先,由于Fragment
未附加到Activity
上,因此您的代码崩溃了。因此,一种快速的解决方案是添加一个null检查,如下所示:
Activity activity = getActivity();
if (activity != null && activity instanceof HomeActivity) {
HomeActivity myactivity = (HomeActivity) activity;
selectedWorkout = myactivity.getSelectedWorkout();
}
也就是说,像这样访问Activity
并不是一个好习惯,因为它将Fragment与特定的Activity
耦合在一起。有几种更好的方法来解决它,例如:
方法一:
使Activity
实现一个类似于SelectedWorkoutProvider
的接口,将getSelectedWorkout()方法移至该接口并强制转换为该接口,而不是移至HomeActivity
方法二:
通过参数将选定的锻炼传递到Fragment
,如下所示:
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
here
答案 1 :(得分:0)
另一种方法是使用EventBus(或其他类似的库),并在每次选择锻炼时将事件从活动发送到片段