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

时间:2018-07-17 17:40:02

标签: java android

我试图从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 个答案:

答案 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(或其他类似的库),并在每次选择锻炼时将事件从活动发送到片段