使用带有ViewPager的FragmentPagerAdapter在片段中启动新活动的NullPE

时间:2014-06-07 16:00:54

标签: android android-intent android-fragments android-asynctask

我有一个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)

1 个答案:

答案 0 :(得分:0)

在Android中保留对片段或活动的引用并不是一个好习惯,因为它们可能随时被系统破坏。您应该使用方法getActivity(),如果未附加Fragment,则可能返回null,而不是保留对片段中的Activity的引用。您可能希望在条件为isAdded()的情况下使用if语句包含对getActivity()的调用,该语句告诉您片段是否附加到Activity。