我有一个名为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的原因是它需要通过不同的方法传递数据以进行查看寻呼机活动。答案可以在这里找到..
答案 0 :(得分:2)
您确定问题中的代码是唯一负责创建片段的地方吗?我怀疑你所展示的代码实际上是罪魁祸首,因为你正在创建Fragment
,而不是ProfileFragment
,因此你的代码不会导致{onCreateView
1}} ProfileFragment
的方法完全被击中。
片段是否由您的活动布局或其他代码自动创建?在那种情况下,没有争论。
在我看来,你应该做到以下几点:
onCreateView
中,以便您优雅地处理不具备任何参数的案例这看起来像这样:
@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);
不要忘记让参数相同。