我有一个活动和一个片段。 在活动中,我正在初始化当前用户(手动):
User currentUser;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
currentUser = new User("email", "name", "secondName", "age");
\\.....}
MainActivity包含这样的方法:
public User getCurrentUser() {
return currentUser;
}
现在,问题出在这里: 在子片段中,我从mainActivity调用getCurrentUser,如下所示:
User u = MainActivity.newInstance().getCurrentUser();
MainActivity.newInstance() - 在mainActivity中定义,返回一个静态的活动实例:
private static MainActivity mainActivityInstance = new MainActivity();
public static MainActivity newInstance() {
return mainActivityInstance;
}
问题是getCurrentUser返回一个空对象引用,即使在mainActivity中使用有效数据初始化currentUser。 所以,请举例说明
u.getName();
会给我一个NullPointerException 我怎么解决这个问题?我觉得我吓坏了 感谢。
答案 0 :(得分:4)
MainActivity.newInstance() - 在mainActivity中定义,返回一个静态的活动实例:
从不直接自己创建活动实例。
问题是getCurrentUser返回一个空对象引用,即使在mainActivity中使用有效数据初始化currentUser
这些活动实例是单独的Java对象。
从片段中,调用getActivity()
以检索托管片段的活动对象。任何关于Android应用程序开发的好书或课程都会介绍这一点。
答案 1 :(得分:3)
许多人说:"你不能在片段中实例化一个活动"。
第二:您可以实现许多选项,以便将用户置于片段中。以下是常见选项:
1 - 将用户作为片段中的参数传递:
public static FragmentChild newInstance(User user){
Bundle b = new Bundle();
b.putSerializable("USER_PARAM",user);
FragmentChild fragment = new FragmentChild();
fragment.putArguments(b);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
User user = getArguments().getSerializable("USER_PARAM")
}
public class User implements Serializable {}
2 - 使用方法((MainActivity)getActivity())。getCurrentUser()。它会工作,但如果你想以正确的方式做,你应该使用一个接口,而不是直接使用MainActivity。
界面选项:
public class MainActivity extends AppCompatActivity implements UserDeliver {
@Override
public User getUser(){
return user;
}
}
public class MyFragment extends Fragment {
private UserDeliver userDeliver;
private User user;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
user = userDeliver.getUser();
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
userDeliver = (UserDeliver) context;
}
@Override
public void onDetach() {
super.onDetach();
userDeliver = null;
}
public interface UserDeliver {
User getUser();
}
}
答案 2 :(得分:1)
首先,你不能通过new创建一个Activity。它会编译,但不能正确初始化,因为只有框架可以做到这一点。
其次 - 永远不要在静态变量中保存活动。这会泄漏内存。大量内存,因为整个视图层次结构都有来自Activity的引用。这样做会导致OOM错误。
答案 3 :(得分:0)
每次执行MainActivity.newInstance()
尝试使用((MainActivity)getActivity).getCurrentUser();
或者在片段
中创建用户的实例