【问题标题】:calling an activity method from custom onClickListener class从自定义 onClickListener 类调用活动方法
【发布时间】:2014-07-17 18:19:57
【问题描述】:

我试图从自定义 onClickListener 对象调用留在我的 MainActivity 类中的方法。而且变量作用域有问题。

所以在我的 MainActivity 我有:

Button resetButton = (Button) findViewById(R.id.ResetButton);
View.OnClickListener myListener = new MyListener(GameBoard, width);
resetButton.setOnClickListener(myListener);

这就是我的 myListener 类的样子:

public class MyListener implements View.OnClickListener
{
    private static MainActivity mainActivity;
    public MyListener(MainActivity mainActivity) {
    this.mainActivity = mainActivity;
}

    @Override
    public void onClick(View v) {
        mainActivity.myMethod();
    }
}

以及 MainActivity 中使用一些 MainActivity 实例变量的方法:

public void myMethod()
{
    InstanceVariable++;  // for example
}

然后,当我通过单击 resetButton 在传递给 myListener 构造函数的 mainActivity 对象上调用 myMethod 时,我收到有关 MainActivity InstanceVariable 范围的错误消息。我是android编程的初学者,所以我不能完全理解它的来源。

当我将这个InstanceVariable 传递给constructormyListener object 时,这个错误就会消失。我认为应该有一种更简单的方法来做到这一点。

【问题讨论】:

  • 这样的静态上下文会导致巨大的内存泄漏
  • 为什么不呢,在你的listner类中,女巫我想是你的MainActivity的一个内部类,调用这样的方法:MainActivity.this.myMethod();
  • @GabeSechan 请您解释一下。我只是对上下文到底是什么感到困惑。
  • 上下文是一个活动或服务。如果你保留一个静态引用,垃圾收集器将无法释放它。这意味着它将无法释放它引用的任何内容。这几乎意味着您的活动中的任何变量都不会被释放。

标签: java android class scope


【解决方案1】:

改为:

public void myMethod() {
    mainActivity.instanceVariable++;  // for example
}

instancevariable 在您的 MyListener 类中不可见,您必须指出它在 mainActivity 对象中。

如果您的 instanceVariable 是私有的,请在 mainActivity 中创建 getter 函数:

public void getInstanceVariable() {
   return this.instanceVariable
}

并以这种方式使用它:

public void myMethod() {
        mainActivity.setInstanceVariable(mainActivity.getInstanceVariable()+1);  // for example
    }

【讨论】:

    【解决方案2】:

    使 InstanceVariable 变为

    public static int InstanceVariable;
    

    并使用它

     @Override 
        public void onClick(View v) {
            MainActivity.InstanceVariable++;
        } 
    

    不要为少于 8 行

    的函数创建方法

    【讨论】:

    • 是的,但我这样做只是为了这篇文章作为简短的例子
    【解决方案3】:

    试试这个:

    让你的听众成为你活动的内部类,然后:

    class MyListener implements View.OnClickListener {
    
    public MyListener() {
    
             }
    
    @Override
    public void onClick(View v) {
        MainActivity.this.myMethod();
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      相关资源
      最近更新 更多