Java 在OnClickListener内部,我无法访问很多东西-如何接近?

Java 在OnClickListener内部,我无法访问很多东西-如何接近?,java,android,Java,Android,在OnClickListener内部,我无法访问范围“外部”的大多数变量,如下所示: findViewById(R.id.Button01).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent mainApps = new Intent(Intent.

在OnClickListener内部,我无法访问范围“外部”的大多数变量,如下所示:

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);*/
            }

        });
findViewById(R.id.Button01).setOnClickListener(新的OnClickListener()
{
@凌驾
公共void onClick(视图v)
{
Intent mainApps=新的Intent(Intent.ACTION\u MAIN);
mainApps.addCategory(Intent.CATEGORY_启动器);
列表活动=this.getPackageManager().QueryInputActivities(mainApps,0);
/*
意向意向=新意向(“com.sygic.drive/com.sygic/drive/.SygicDriveActivity”);
星触觉(意向)*/
}
});
在本例中,我需要获取PacketManager,但由于OnClickListener中没有可用的上下文,因此无法获取它


我可以在外部创建一个静态引用,在内部使用它,但这是正确的吗?一直这样做似乎很奇怪?

您可以做一些事情,创建一个内部类来实现onClickListener,并将必要的参数传递给类的构造函数。我仍然不认为这是最干净的方法。我通常只是创建另一个方法来执行我的操作。所以在onClick(视图v)中,我会这样做

onClick(View v){doMyAction(myParams)}

private void doMyAction(Object params){//do stuff}

只需将所需的参数从侦听器方法传递到侦听器外部的方法。

将代码中的
this
替换为
MyActivity。this
其中MyActivity是活动子类的类名


说明:使用这部分代码时,您正在创建一个匿名内部类:
new OnClickListener(){

匿名内部类有一个对创建它们的类实例的引用。看起来您是在活动子类中创建它的,因为findViewById是一个活动方法。活动是一个上下文,所以您需要做的就是使用自动对它的引用。

您还可以实现在类中单击listener接口,避免匿名内部类的需要。然后将单击式侦听器设置为:

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


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

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

好吧,奇怪的是你必须这样做,但我想它是有效的。=)我在谷歌上搜索了一段时间,只是为了找到“我的活动。这个”。现在看起来很简单。感谢您提供的信息!访问导致错误的变量怎么样?
无法引用在不同方法中定义的内部类中的非最终变量表?
?我无法通过
MyActivity访问这些变量。这是
。这些是局部变量。如果它们没有更改,您可以将其声明更改为在它们中有final。如果它们确实发生了变化,但在定义内部类之前,您可以在此之前定义一个最终版本。例如:final int myFinalErrorCode=errorCode。否则,您必须在您访问的活动或内部类中创建并设置成员。我不理解这一行为,但它按照您所说的方式工作
Activity.this.doStg()
。请在这里@LanceNanek附加一些url,并提供更详细的解释。它是否与反应式编程有关?请参阅此处的“ShadowTest.this”示例: