里面的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()。 无论如何解决了我的问题。
- 无法parsing:com.google.firebase:firebase-core:11.2.0
- 如何使用ViewFlipper移动到某个视图?
- 如何在Android Studio中创build发布的Android库包(aar)(不debugging)
- 如何在非活动类(LocationManager)中使用getSystemService?
- 签名版本之间的区别 – V1(瓶签名)和V2(全APK签名),而在AndroidStudio中生成签名的apk?
- 如何让Android Studio停止在search结果中返回生成的代码?
- Android Studio 3.0风味维度问题
- SecurityException:调用者uid XXXX与authentication者的uid不同
- jar子不匹配! 修复你的FacebookSDK的依赖关系