【问题标题】:Can't access Application variable from OnClickListener class无法从 OnClickListener 类访问应用程序变量
【发布时间】:2014-05-27 23:17:25
【问题描述】:

我的 Android 应用程序中有一个 OnCLick 侦听器类,定义如下。我需要访问一个应用程序级变量,但是这段代码的最后一行会产生这个编译错误: "方法 getApplication() 未定义 OnClickListenerSelectPresetItem 类型"

如何从此类访问应用程序变量?

public class OnClickListenerSelectPresetItem implements OnClickListener {
    private long glbMealId = ((MyApplication) this.getApplication()).getMealId();

【问题讨论】:

  • 能否请您提供更多代码?
  • 尝试使用 classname.this 或放入 getContext()

标签: java android variables


【解决方案1】:

错误非常明显。 this 是监听器对象,而不是执行监听器的上下文。

你应该使用ActivityExecutingListener.this.getApplication()

编辑:如果您的侦听器不是匿名/内部类,则需要将 Context 存储在侦听器实例中:

public class OnClickListenerSelectPresetItem implements OnClickListener {
  private long glbMealId;
  private Activity activity;

  public OnClickListenerSelectPresetItem(Activity activity) {
    this.activity = activity; // facultative, but you may need it in onClick() ...
    this.glbMealId = ((MyApplication) activity.getApplication()).getMealId();
  }

  ...
}

【讨论】:

  • 我刚刚尝试了您的确切代码,但最后一行给出“方法 getApplication() 未定义类型 Context”
  • 已编辑:getApplication() 只能在 Activity 中使用,不能从 Context 中使用。
  • 那么我怎样才能从这个类中访问我的应用程序变量呢? (因为它不是一个 Activity 类)
  • 只需将活动传递给带有new OnClickListenerSelectPresetItem(this) 的侦听器,其中this 是一个活动(或者因为getApplication() 也可以在Service 类中提供一个服务)。请参阅编辑后的答案。
  • 这是我在 Activity 中编写的代码: textViewItem.setOnClickListener(new OnClickListenerSelectPresetItem(this));
【解决方案2】:

在您的情况下,此运算符引用 OnClickListenerSelectPresetItem

这是您尝试做的一个示例,从我的一个项目中剪切粘贴:

public class PageFragment extends Fragment {

    private boolean isVisible( View view )
    {
        return true; // fake 
    }

    private class OnLikeClickListener implements OnClickListener
    {
        private boolean isVisible = PageFragment.this.isVisible(); // <------
        @Override
        public void onClick(View v) 
        {
            // Do whatever

        }

    }
}

【讨论】:

  • 对不起,我没有关注这个!它是否包含有关如何从 OnClickListener 类访问应用程序变量的任何线索?
  • 您正在尝试访问封闭类。 IE。持有您的 OnClickListenerSelectPresetItem 的类。我举了一个如何访问封闭类的例子。
  • 你的封闭类是什么?
  • 其实我不想访问封闭类。我只是试图访问在 MyApplication 类中定义的变量(它纯粹是为了托管一些“全局”变量而创建的)。
  • 这个MyApplication是继承了Android Application类,也在Manifest.XML中设置,还是只是一个通用的静态类?
【解决方案3】:

好的。终于明白你的问题是什么了。

您想引用 Application 类的实现。 所以要么:

  1. 按照@pdegand59 的建议,将Activity 传递给OnClickListenerSelectPresetItem 的构造函数。

  2. 为方便起见,将 MyApplication 设为单例(我这样做是因为我不喜欢传递活动):Android Application as Singleton

【讨论】:

    猜你喜欢
    • 2019-07-17
    • 2010-09-08
    • 2015-03-29
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    相关资源
    最近更新 更多