我有一个viewpager
使用一个附加了2 Fragment
个适配器的适配器连接。我基本上是尝试实现Signin / Signup页面并使用片段。此外,这是我第一次尝试使用片段。
现在,从这两个片段中的每个片段开始,我想在按钮点击时启动另一个Activity
,这将启动AsyncTask
。此AsyncTask
将调用登录或注册请求,完成后将数据存储在session_details中(使用sharedPreference)。在进行会话后,这将使用Intent启动一个活动。此外,以下代码中使用的Object是可序列化对象。
我的问题是,当我尝试使用startActivityforIntent()
启动Intent时,我得到NullPointerException
。我正在存储使用getActivity()
初始化的fa并且正确打印toast但是不能用于启动Intents。我错过了什么吗?我是否需要注册清单中的任何片段?我在清单中只注册了RegLoginActivity。另外,请注意我将整个代码写在一个文件中,因此使用内部类来实现Fragments。
public class RegLoginActivity extends ActionBarActivity {
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
setContentView(R.layout.reg_login);
viewPager = (ViewPager) findViewById(R.id.pager);
actionBar = getActionBar();
session_details = SessionManager.getInstance(RegLoginActivity.this.getApplicationContext());
FragmentManager fm = getSupportFragmentManager();
TwoTabAdapter tabAdapter = new TwoTabAdapter(fm);
viewPager.setAdapter(tabAdapter);
}
private class TwoTabAdapter extends FragmentPagerAdapter {
public TwoTabAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int arg0) {
if (arg0 == 0) {
return Login.loginInstance();
} else if (arg0 == 1){
return Register.registerInstance();
}
return null;
}
@Override
public int getCount() {
return 2;
}
}
public static class Login extends Fragment {
private static Login login;
private static FragmentActivity fa;
public static Login loginInstance() {
if (login == null)
login = new Login();
return login;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
fa = getActivity();
View v = inflater.inflate(R.layout.activity_login, container, false);
loginScreen = v.findViewById(R.id.login_screen);
login_email_id = (EditText) loginScreen.findViewById(R.id.login_email_id);
login_password = (EditText) loginScreen.findViewById(R.id.login_password);
login_button = (TextViewBold) loginScreen.findViewById(R.id.login_button);
login_button.setOnClickListener(new RegLoginActivity().new ClickHandler());
return v;
}
};
private class ClickHandler implements View.OnClickListener {
@Override
public void onClick(View v) {
if (v.getId() == login_button.getId()) {
userLogin();
}
}
}
private void userLogin() {
//This Toast is getting displayed on each click of Login.
Toast.makeText(Login.fa, "starting Email Login", Toast.LENGTH_SHORT).show();
EmailLogin t = new EmailLogin();
t.execute();
try {
t.get();
} catch (final Exception e) {
}
if (user != null && user.id != 0) {
session_details.createLoginSession();
try {
Intent i = new Intent(Login.fa, OverviewActivity.class);
i.putExtra("user", user);
**//This Intent throws Null Pointer Exception
startActivityForResult(i, 0);**
} catch(Exception e) {
**//This says NullPointerException**
android.util.Log.v("Intent Exception", e.toString());
e.printStackTrace();
}
}
}
堆栈跟踪:
06-07 14:06:34.340: W/System.err(929): java.lang.NullPointerException
06-07 14:06:34.351: W/System.err(929): at android.app.Activity.startActivityForResult(Activity.java:3390)
06-07 14:06:34.351: W/System.err(929): at android.app.Activity.startActivityForResult(Activity.java:3351)
06-07 14:06:34.351: W/System.err(929): at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:839)
06-07 14:06:34.361: W/System.err(929): at <packageName>.RegLoginActivity.userLogin(RegLoginActivity.java:343)
06-07 14:06:34.361: W/System.err(929): at <packageName>.RegLoginActivity.access$8(RegLoginActivity.java:317)
06-07 14:06:34.361: W/System.err(929): at <packageName>.RegLoginActivity$ClickHandler.onClick(RegLoginActivity.java:306)
06-07 14:06:34.371: W/System.err(929): at android.view.View.performClick(View.java:4240)
06-07 14:06:34.371: W/System.err(929): at android.view.View$PerformClick.run(View.java:17721)
06-07 14:06:34.371: W/System.err(929): at android.os.Handler.handleCallback(Handler.java:730)
06-07 14:06:34.381: W/System.err(929): at android.os.Handler.dispatchMessage(Handler.java:92)
06-07 14:06:34.381: W/System.err(929): at android.os.Looper.loop(Looper.java:137)
06-07 14:06:34.381: W/System.err(929): at android.app.ActivityThread.main(ActivityThread.java:5103)
06-07 14:06:34.381: W/System.err(929): at java.lang.reflect.Method.invokeNative(Native Method)
06-07 14:06:34.391: W/System.err(929): at java.lang.reflect.Method.invoke(Method.java:525)
06-07 14:06:34.391: W/System.err(929): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
06-07 14:06:34.391: W/System.err(929): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
06-07 14:06:34.401: W/System.err(929): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:0)
在Android中保留对片段或活动的引用并不是一个好习惯,因为它们可能随时被系统破坏。您应该使用方法getActivity(),如果未附加Fragment,则可能返回null,而不是保留对片段中的Activity的引用。您可能希望在条件为isAdded()的情况下使用if语句包含对getActivity()的调用,该语句告诉您片段是否附加到Activity。