从OnClickListener访问Activity(this)

时间:2014-03-05 11:24:41

标签: java android

我是java和android开发的新手,我有一个问题,让我解释一下。 我有自定义接口和自定义类,使用它作为监听器。

在我的HomeActivity中,我在自定义类上调用方法,类通过侦听器(接口)响应,这是简短版本:

public class HomeActivity extends Activity implements WebClientResponseListener {
    private User user;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //....
        // I call my class and add this as a listener:
        MyWebServiceClient mws = new MyWebServiceClient(getApplicationContext());
        mws.getProducts(this.user.getToken(), this)
    }
    //....
    @Override
    public void onDataDownloadSuccess(JSONObject jsonObject) {
        Log.d("DATA", "SUCCESS");
    }
}

当我运行它时,一切正常。调用onDataDownloadSuccess方法,我可以看到日志输出。

当我尝试从OnClickListener运行它时出现问题:

private void sendRequest() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(getString(R.string.request_info_title));
    builder.setItems(items, this);
    //.....
    builder.create().show();
}

后来我参加了同样的活动:

public void onClick(DialogInterface dialogInterface, int which) {
    MyWebServiceClient mws = new MyWebServiceClient(getApplicationContext());
     mws.getProducts(user.getToken(), this)
}

在这种情况下,我的侦听器onDataDownloadSuccess方法未被调用。 我可以在控制台中看到:

  

调用unregisterIRListener()

  

GC_FOR_ALLOC释放1613K,35%免费13400K / 20408K,暂停18ms,总计   时间18ms

我正在寻找解决方案,我已经尝试了一些例子:

//in OnClick
mws.getProducts(user.getToken(), HomeActivity.this);

我创建了私有变量HomeActivity,在onCreate中我调用了

homeActivity = this;

稍后在onClick上我试图传递homeActivity而不是这个 但没有运气。 提前谢谢。

4 个答案:

答案 0 :(得分:6)

始终尝试使用 YOUR_ACTIVITY_NAME.this ,因为当您仅使用“this”时,它会指向当前的context。假设你在OnClickListener,它是一个匿名类,所以当你在其中使用 this 时。它会指向button而不是activity。因此,您需要使用 activityname.this指向活动。

答案 1 :(得分:5)

当您需要context而不是activity时,变量必须是:

Context homeActivity;

Context context;  

然后在onCreate()

context=this; 

在您的活动中使用contexthomeActivityHomeActivity.this

在点击监听器中,“this”是点击监听器的参考。

答案 2 :(得分:0)

您可以创建Context的实例并将其初始化为侦听器外的this,然后只需将其调用到您需要的地方

答案 3 :(得分:0)

以上解决方案应该可以很好地工作,但仍要添加一些风味。认为这将有助于某人更好地理解。

public class SampleActivity extends AppCompatActivity {

private Context sampleActivityContext; 
private Button continueButton;
// All your class level variables/fields declared in this section

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    sampleActivityContext = this; // Assigning the current activity(i.e.,) SampleActivity context
    .......
    continueButton = findViewById(R.id.continueButton); // Map the UI element from the XML to the corresponding java element
    .......  
   // Setting the onclick listener for the button 
    continueButton.setOnClickListener(new View.onClickListener() {
 @Override
  public void onClick(View view) {
 // When you need the context of the activity use sampleActivityContext 
 // instead of this keyword as this will refer the current view/button within the section 
// or you can prefer SampleActivity.this as well 

} 
}