Java 为什么可以';我不能在手动实例化的活动上调用startActivity吗?
我只是对这个例外有个问题。我已经修复了代码,但我不知道为什么我不能使用我原来的方式Java 为什么可以';我不能在手动实例化的活动上调用startActivity吗?,java,android,nullpointerexception,Java,Android,Nullpointerexception,我只是对这个例外有个问题。我已经修复了代码,但我不知道为什么我不能使用我原来的方式 public class Login extends Activity { EditText account, password; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContent
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(),为什么没有得到任何值代码>用于侦听器?此方法失败的原因是,您不能只是实例化一个活动,然后像在android中使用活动一样使用它
解释:由于未在活动中设置ActivityThread
而引发此nullPointerException
。这是一个内部私有字段,通常在调用活动的attach
方法时设置(注意:这不是onAttach
,而是私有方法attach
)
这反过来又被一些其他子系统调用,比如ActivityThread
和LocalActivityManager
,所有这些都是您无法直接控制的;但是,在正确启动活动时调用
本质上,如果你想调用startActivity(Activity)
,你应该确保你调用它是从Context
或扩展的内容,并且是android生命周期的活跃部分(例如Login.this
Activity实例,它已经被正确实例化并由android管理)
简而言之,您当前使用的技术(Login.this
)是一种正确的方法
将来,根据定义类的位置/方式,将上下文作为参数传递给类的构造函数并在需要时使用该上下文也是正确的 您永远不希望手动实例化activity@TimCastelijns-看起来按钮侦听器是一个内部类。无法登录。是否使用此.startActivity
?@cricket\u 007首选方法如下<代码>v.getContext().startActivity(go)
。我不知道为什么还没有被建议。我可以使用,但我只是想知道为什么我不能实例化这个类并使用它。很抱歉,有争议。我最初的问题是,为什么Android不让我只使用实例化对象(引用登录名、扩展活动、上下文的子类)而不使用登录名呢?非常感谢你的帮助,伙计:)和新年快乐:)