【问题标题】:Cannot use this in static context不能在静态上下文中使用它
【发布时间】:2014-10-12 14:13:14
【问题描述】:

当我声明此方法时,它会写入错误:不能在静态上下文中使用它。错误出现在 ArrayAdapter 适配器 = ... 您知道我可以更改哪个吗?我完全不知道。

 protected static void myMethod()
  {
    arrTblNames = new ArrayList<String>();
    Cursor c =
        db.rawQuery
        (
            "SELECT name FROM sqlite_master WHERE type = 'table' AND  name! = 'android_metadata'", null
        );

    if (c.moveToFirst())
    {
        while (!c.isAfterLast())
        {
            arrTblNames.add(c.getString(c.getColumnIndex("name")));
            c.moveToNext();
        }
    }

    ArrayAdapter<String> adapter =
        new ArrayAdapter<String>
        (

                //HERE IS THE ERROR
                this, android.R.layout.simple_spinner_item, arrTblNames

        );
    adapter.setDropDownViewResource
    (
        android.R.layout.simple_spinner_dropdown_item
    );
    spinner.setAdapter(adapter);
    spinner.setOnItemSelectedListener
    (
        new AdapterView.OnItemSelectedListener()
        {
            @Override
            public void onItemSelected
            (
                AdapterView<?> parent, View view, int pos, long id
            )
            {
                selectedtable = spinner.getSelectedItem().toString();
            }
            @Override
            public void onNothingSelected(AdapterView<?> arg0)
            {
                //
            }
        }
    );
}

【问题讨论】:

    标签: android static spinner this


    【解决方案1】:

    万一你有理由让这个成为一个静态方法,你可以传递一个上下文作为参数

    protected static void myMethod(Context myContext)
    

    那么你可以使用myContext而不是this

    【讨论】:

    • 谢谢,我怎么调用这个方法,我试试 MainActivity.myMethod();但它写错误,我需要在这个方法中的一些参数,我不知道是哪个,你有什么想法吗?
    • 这取决于你从哪里调用它,但无论在哪里,你都需要传递Context 类型的参数让我们假设你从其他活动中调用它,在这种情况下你可以使用:MainActivity.myMethod(this);
    • 你是最棒的!它有效,非常感谢你我整天都在寻找这个解决方案! :)
    【解决方案2】:

    静态方法属于一个类而不属于该类的对象,并且没有实例与之关联。 this 关键字总是指类的实例(对象),因此您只能在可用时使用它,例如在实例方法中。

    您不能在静态方法中使用 this,因此您要么需要将其更改为实例成员(即定义不带 static 的方法),要么在方法需要时不要使用 this保持静态。

    【讨论】:

      【解决方案3】:

      你的方法不应该是静态的:

      protected void myMethod()
      

      当您想在不实例化该特定类的情况下调用它们时使用静态方法。 但是,如果一个类扩展了 Activity 并且它还没有被实例化,那么它就没有设置任何上下文。

      由于您正在创建微调器适配器和其他依赖于上下文的工作,因此您的方法不应该是静态的。

      【讨论】:

      • "当你想从其他类调用它时使用静态方法。" - 错误的。不能调用其他类的实例方法吗?
      • 我需要从其他活动中调用此方法,例如当我添加/删除表时,我需要在微调器中刷新名称,所以我需要它是静态的,但我不知道如何替换“this”
      • @luketsunami 您的活动不应该以这种方式进行交互。您知道一次只能看到一个。相反,当您返回“微调器活动”时,您将收到对onResume 的调用。如有必要,您可以在那里更新微调器。
      • @MarcellFülöp 是的,你是对的。我说得不够清楚。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 2019-03-17
      • 2011-11-30
      相关资源
      最近更新 更多