无法对非静态方法进行静态引用(Android getApplicationContext())

7

我一直在使用android.app.Application的子类来存储在我的Android应用程序中跨活动所需的全局变量,如Soonil(在如何在Android中声明全局变量?中所述)所解释的那样。

这种方法看起来像这样:

class MyApp extends Application {

    private String myState;

    public String getState(){
    return myState;
    }
        public void setState(String s){
        myState = s;
    }
}

class Blah extends Activity {

    @Override
    public void onCreate(Bundle b){
    ...
    MyApp appState = ((MyApp)getApplicationContext());
    String state = appState.getState();
    ...
    }
}

到目前为止,这种方法已经很好地用于从任何一个活动中访问全局变量。但今天使用同样的方法时,我遇到了以下错误:

Cannot make a static reference to the non-static method getApplicationContext()
from the type ContextWrapper

与以往不同的关键是,新的Activity实际上是一个Fragment(确切地说是SherlockFragmentActivity)。

是否有任何想法为什么我不能像以前那样访问appState,并且有没有好的解决方法?

非常感谢。


编辑:Matt B.发现了一个问题。事实证明我实际上是在另一个类中调用getApplicationContext()。以下是调用点:

public class MyActivity extends SherlockFragmentActivity {
    public static class AccountListFragment extends SherlockListFragment {
        MyApp appState = ((MyApp)getApplicationContext());
        ...
    }
    ...
}

另外,正如下面所指出的那样,在我将调用更改为以下内容时,错误消失了

MyApp appState = ((MyApp)getActivity().getApplicationContext());

我们能看到你在扩展SherlockFragmentActivity的活动中实际的代码吗?编辑:我在我的SherlockFragmentActivity中尝试了Application appState = ((Application)getApplicationContext());,它编译得很好。 - Austyn Mahoney
我没有看到在这段代码示例中你试图对该方法进行静态引用。你确定发布了正确的代码行吗? - matt b
你能否将答案标记为正确的吗? - vanleeuwenbram
1个回答

4
getActivity().getApplication() 

应该能正常工作。

首先需要引用到Activity,然后引用到Application。

区别在于您现在是从Fragment(即使您将其命名为“Activity”)而不是从Activity调用此函数。


根据他的问题,他说这是一个SherlockFragmentActivity。如果他实际上指的是SherlockFragment,那么你的答案可能是正确的。 - Austyn Mahoney
新的Activity实际上是一个Fragment(确切地说,是SherlockFragmentActivity)。我理解他将自己的片段命名为“SherlockFragmentActivity”。 - vanleeuwenbram
谢谢,看起来错误已经解决了!不过,为了明确起见,您知道为什么我需要在这种情况下添加getActivity()调用(从SherlockFragmentActivity内部),但之前不需要(从普通Activity内部)吗? - gcl1
1
首先,你把“Fragment”命名为“Activity”,这很令人困惑。如果一个类没有“Activity”的基类,那么它的名称中不应该包含“Activity”。 - Austyn Mahoney
该代码片段来自Github存储库(http://code.google.com/p/sherlock-demo/source/browse/#git%2Fsrc%2Fcom%2Fexample%2Fandroid%2Fsherlockdemo)。我也觉得术语“活动”有些令人困惑,但除此之外,代码似乎能够正常工作:)。 - gcl1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接