为什么我不能在手动实例化的Activity上调用startActivity?

时间:2015-12-31 14:49:58

标签: java android nullpointerexception

我对这个例外有疑问。我已经修复了代码,但我不知道为什么我不能使用我原来的方式。

public class Login extends Activity
{
    EditText account, password;

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

        account = (EditText) this.findViewById(R.id.account);
        password = (EditText) this.findViewById(R.id.password);

        Button_Listener listener = new Button_Listener();
        Button login = (Button) this.findViewById(R.id.login);
        login.setOnClickListener(listener);
        Button reset = (Button) this.findViewById(R.id.reset);
        reset.setOnClickListener(listener);
    }

    class Button_Listener implements View.OnClickListener
    {
        Login l = new Login();

        public void onClick(View v)
        {
            switch(v.getId())
            {
                case R.id.login:
                    if(account.getText().toString().equals("kenny"))
                    {
                        if(password.getText().toString().equals("12345"))
                        {
                            Toast.makeText(Login.this,"Welcome",Toast.LENGTH_SHORT).show();
                            Intent go = new Intent();
                            go.setClass(Login.this,MainMenu.class);
                            l.startActivity(go);   // NullPointerException here
                            Login.this.overridePendingTransition(R.anim.enter,R.anim.exit);
                        }
                        else
                            Toast.makeText(Login.this, "Account or Password is incorrect", Toast.LENGTH_SHORT).show();

                    } else {
                        Toast.makeText(Login.this, "Account or Password is incorrect", Toast.LENGTH_SHORT).show();
                    }
                    break;
                case R.id.reset:
                    account.setText("");
                    password.setText("");
                    break;
            }
        }
    }
}

为什么我在评论专线上获得NullPointerException?当我使用Login.this时,我没有得到这个例外。

除了这个问题,如果我为听众做String name = account.getText().toString();,为什么我没有得到任何价值?

1 个答案:

答案 0 :(得分:0)

此方法失败的原因是因为您不能仅仅实例化一个活动并将其用作android中的活动。

解释:由于nullPointerException未在您的活动中设置,因此ActivityThread被抛出。这是一个内部私有字段,通常在调用活动的attach方法时设置(注意:这不是onAttach,而是私有方法attach

这又由其他几个子系统调用,例如ActivityThreadLocalActivityManager,所有这些子系统都没有直接控制;但是,当你正确开始活动时会被调用。

基本上,如果你想调用startActivity(Activity),你应该确保你从那些是Context的东西中调用它,并且它是android生命周期的活跃部分(例如{{1}已经正确实例化并由android管理的活动实例。

简而言之,您当前使用的技术(Login.this)是一种正确的方法。

将来,根据您在何处/如何定义类,将上下文作为参数传递给类的构造函数并在需要时使用该上下文也是正确的。