里面的OnClickListener我不能访问很多东西 – 如何处理?

在OnClickListener中,我无法访问范围外部的大多数variables,如下所示:

findViewById(R.id.Button01).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent mainApps = new Intent(Intent.ACTION_MAIN); mainApps.addCategory(Intent.CATEGORY_LAUNCHER); List<ActivityInfo> activities = this.getPackageManager().queryIntentActivities(mainApps, 0); /* Intent intent = new Intent("com.sygic.drive/com.sygic/drive/.SygicDriveActivity"); startActivity(intent);*/ } }); 

在这个例子中,我需要得到PacketManager,我不能得到它,因为我没有在OnClickListener内可用的上下文。

我可以在外面做一个静态引用,并在里面使用它,但这是正确的吗? 似乎不得不一直这样做呢?

在代码MyActivity.this其replace为MyActivity.this ,其中MyActivity是您的Activity子类的类名称。

说明:当您使用这部分代码时,您正在创build一个匿名内部类:
new OnClickListener() {
匿名内部类有一个对它们创build的类的实例的引用。它看起来像是在一个Activity子类中创build它,因为findViewById是一个Activity方法。 活动是一个上下文,所以你所需要做的就是使用自动引用它。

你也可以在你的类中实现OnClickListener接口,避免使用匿名内部类。 然后你可以像这样设置点击监听器:

findViewById(R.id.Button01).setOnClickListener(this);

如果您有多个使用一个侦听器的button,可以使用一个带有view.getId()(对应于R.id中的视图ID)的switch语句来区分它们。

有几件事你可以做,你可以创build一个实现onClickListener的内部类,并将必要的parameter passing给类的构造函数。 我仍然没有find最干净的方法。 我通常只是创build另一种方法来执行我的行动。 所以在onClick(View v)我会做这样的事情。

 onClick(View v){doMyAction(myParams)} private void doMyAction(Object params){//do stuff} 

只需将侦听器方法中所需的parameter passing给侦听器外部的方法即可。

将使用的Intent构造函数更改为Intent(context,classname),并在您的内部类中使用getApplicationContext()。 无论如何解决了我的问题。