从父活动获取值将返回null

时间:2017-01-13 14:43:13

标签: java android android-fragments

我有一个活动和一个片段。 在活动中,我正在初始化当前用户(手动):

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 我怎么解决这个问题?我觉得我吓坏了 感谢。

4 个答案:

答案 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()

时,U都会生成MainActivity的newInstance

尝试使用((MainActivity)getActivity).getCurrentUser();

检索您的用户

或者在片段

中创建用户的实例