如何从OnClickListener引用MainActivity?

问题描述:

这是MainActivity如何从OnClickListener引用MainActivity?

imgModeContrastLeft.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ImagePair imp = new ImagePair(); 
       String objId = "sMfSYvBxmX"; 
       imp.downloadImagePairInBackground(this, objId); 
      }   
    }); 

this不是MainActivity。我如何参考OnClickListener中的主要活动?

+0

'getActivity()'或'getBaseActivity()'如果我”我认为它是'getBaseContext();'? – Razgriz 2014-12-01 17:34:51

你可以做MainActivity.this获得在MainActivity背景

这是正确的代码:

imgModeContrastLeft.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ImagePair imp = new ImagePair(); 
       String objId = "sMfSYvBxmX"; 
       imp.downloadImagePairInBackground(MainActivity.this, objId); 
      }   
    }); 

v.getContext()这里是 “最好” 的方式

public void onClick(View v) { 
    ImagePair imp = new ImagePair(); 
    String objId = "sMfSYvBxmX"; 
    imp.downloadImagePairInBackground(v.getContext(), objId); 
}   

这将使其更“可移植的“,所以如果你移动,决定重用另一个类的代码,或者改变类名,你不需要改变它。

你有它的方式,this是指内部类,而不是ActivityContext

+0

我认为NameOfActivity.this总是更好,即使视图不能为空 – Blackbelt 2014-12-01 17:38:16

+0

@Blackbelt为什么? – codeMagic 2014-12-01 17:38:44

+0

因为你不必访问对象检索相同的信息 – Blackbelt 2014-12-01 17:42:32

首先,请记住,一个整体将InnerClass被系在外面类的每一个对象,受条件是InnerClass不是静态的,并且你也创建了一个InnerClass的对象。

现在,每当你需要访问调用将InnerClass的语法对象的引用是:

OuterClassName.this; 

正如在其他的答案中的一个被提到的,你可以有资格this与类名从内部类中引用特定的外部类。然而,这种语法是有点模糊,所以我会建议更明确的(如果也更详细)简单地分配给一个本地方法:

final MainActivity mainActivity = this; 
imgModeContrastLeft.setOnClickListener(...); // reference "mainActivity"