尝试将数据传递给片段

时间:2016-05-04 08:24:03

标签: java android

我有一个名为HomePage的活动,用于保存标签布局样式的3个片段,但我有一个问题,即一旦用户登录,来自登录页面活动的数据将数据传递给HomePage的.java。我想将HomePage.java中的数据传递给ProfileFragment.java。但是,当我这样做时,我收到以下错误:

FATAL EXCEPTION: main
Process: com.example.chang.fyp, PID: 2388
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
    at com.example.chang.fyp.ProfileFragment.onCreateView(ProfileFragment.java:20)

表示错误在行

String firstname = getArguments().getString("firstname");

但我似乎无法找到错误的地方。

HomePage.java

public class HomePage extends ActionBarActivity implements ActionBar.TabListener {

private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private android.support.v7.app.ActionBar actionBar;
//Tab Titles
private String[] tabs = { "Profile", "Events" , "Jobs"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.home_page);


    Intent intent = getIntent();
    String firstname = intent.getStringExtra("firstname");
    String lastname = intent.getStringExtra("lastname");
    String email = intent.getStringExtra("email");

    Bundle bundle1 = new Bundle();
    bundle1.putString("firstname", firstname);
    bundle1.putString("lastname", lastname);
    bundle1.putString("email", email);

    Fragment fragment = new Fragment();
    fragment.setArguments(bundle1);

ProfileFragment.java

public class ProfileFragment extends Fragment{

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

   String firstname = getArguments().getString("firstname");
   String lastname = getArguments().getString("lastname");
   String email = getArguments().getString("email");



    View rootView = inflater.inflate(R.layout.home_page_fragment, container, false);

    final TextView tvFirstName = (TextView) rootView.findViewById(R.id.UserProfileName);
    final TextView tvLastName = (TextView) rootView.findViewById(R.id.UserProfileLastName);
    final TextView tvEmail = (TextView) rootView.findViewById(R.id.UserProfileEmail);


    tvFirstName.setText(firstname);
    tvLastName.setText(lastname);
    tvEmail.setText(email);

    return rootView;
    }
}

登录成功后会出现问题,因为ProfileFragment.java将默认加载。

编辑:对于这些参数感到抱歉,实际上它是一样的,但由于某些原因我扔了一个NPE我不知道是什么..

编辑:NPE的原因是它需要通过不同的方法传递数据以进行查看寻呼机活动。答案可以在这里找到..

Send values from ViewPager Activity to a Fragment by bundle

2 个答案:

答案 0 :(得分:2)

您确定问题中的代码是唯一负责创建片段的地方吗?我怀疑你所展示的代码实际上是罪魁祸首,因为你正在创建Fragment,而不是ProfileFragment,因此你的代码不会导致{onCreateView 1}} ProfileFragment的方法完全被击中。

片段是否由您的活动布局或其他代码自动创建?在那种情况下,没有争论。

在我看来,你应该做到以下几点:

  1. 将代码包裹在片段onCreateView中,以便您优雅地处理不具备任何参数的案例
  2. 设置断点以查看代码是否被多次命中
  3. 这看起来像这样:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                              Bundle savedInstanceState) {
    
        View rootView = inflater.inflate(R.layout.home_page_fragment, container, false);
        final TextView tvFirstName = (TextView) rootView.findViewById(R.id.UserProfileName);
        final TextView tvLastName = (TextView) rootView.findViewById(R.id.UserProfileLastName);
        final TextView tvEmail = (TextView) rootView.findViewById(R.id.UserProfileEmail);
    
        if (getArguments() != null)
        {
            String firstname = getArguments().getString("firstname");
            String lastname = getArguments().getString("lastname");
            String email = getArguments().getString("email");
    
            tvFirstName.setText(firstname);
            tvLastName.setText(lastname);
            tvEmail.setText(email);
        }
    
        return rootView;
    }
    

答案 1 :(得分:1)

在HomePage.java中:bundle1.putString("firstname1", firstname);

在ProfileFragment.java中:String firstname = getArguments().getString("firstname");

您需要使用相同的参数来获取额外内容。使用" firstname"对于两者,或者" firstname1"。姓氏和电子邮件的情况相同。

修改

您似乎在

上初始化了错误的Fragment
Fragment fragment = new Fragment();
fragment.setArguments(bundle1);

尝试这样做,看看它是否有效:

ProfileFragment fragment = new ProfileFragment();
fragment.setArguments(bundle1);

不要忘记让参数相同。