如何从另一个类访问getSharedPreferences?

时间:2011-09-23 11:47:28

标签: java android

我已经建立了2个项目,我的主要项目和推特发布项目。我已经将twitter一个导入主要部分,现在正试图将其连接起来。以下是导入代码。问题是我知道我错过了可能与上下文有关的事情?我刚刚总结了下面主要项目中包含的内容,以便您更好地理解(希望如此)。

import com.tweet.t.TweetToTwitterActivity;

            TweetToTwitterActivity twitter = new TweetToTwitterActivity();
            twitter.buttonLogin(v);

这是TweetToTwitterActivity

public class TweetToTwitterActivity extends Activity {

    private SharedPreferences mPrefs;
    /** Twitter4j object */
    private Twitter mTwitter;
    private RequestToken mReqToken;

    public void buttonLogin(View v) {
        mPrefs = getSharedPreferences("twitterPrefs", MODE_PRIVATE);
        // Load the twitter4j helper
        mTwitter = new TwitterFactory().getInstance();

        // Tell twitter4j that we want to use it with our app
        mTwitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
        if (mPrefs.contains(PREF_ACCESS_TOKEN)) {
            Log.i(TAG, "Repeat User");
            loginAuthorisedUser();
        } else {
            Log.i(TAG, "New User");
            loginNewUser();
        }
    }

Logcat产生此错误

09-23 11:27:40.034: ERROR/AndroidRuntime(229): java.lang.NullPointerException
09-23 11:27:40.034: ERROR/AndroidRuntime(229):     at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:146)
09-23 11:27:40.034: ERROR/AndroidRuntime(229):     at com.tweet.t.TweetToTwitterActivity.buttonLogin(TweetToTwitterActivity.java:74)

并指向此行。

    mPrefs = getSharedPreferences("twitterPrefs", MODE_PRIVATE);

3 个答案:

答案 0 :(得分:3)

getSharedPreferences()是Context类的一种方法。您只是创建一个扩展Activity的TweetToTwitterActivity实例,但此活动目前尚未启动。 解决此问题的一种方法是将Context对象也传递给buttonLogin:

更改public void buttonLogin(View v)

public void buttonLogin(View v, Context context)

mPrefs = getSharedPreferences("twitterPrefs", MODE_PRIVATE);

mPrefs = context.getSharedPreferences("twitterPrefs", MODE_PRIVATE);

twitter.buttonLogin(v);

twitter.buttonLogin(v, this);

答案 1 :(得分:2)

Hemant是对的。

mPrefs = getSharedPreferences("twitterPrefs", MODE_PRIVATE);

为此,您需要TweetToTwitterActivity Activity而不仅仅是一个实例。因此,当您使用new关键字时,永远不会创建活动。只有操作系统可以为你创建一个活动。所以

 twitter.buttonLogin(v, YourCurrentActvity.this);

public void buttonLogin(View v, Context context) {
    mPrefs = context.getSharedPreferences("twitterPrefs", MODE_PRIVATE);
    // Load the twitter4j helper
    mTwitter = new TwitterFactory().getInstance();

    // Tell twitter4j that we want to use it with our app
    mTwitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
    if (mPrefs.contains(PREF_ACCESS_TOKEN)) {
        Log.i(TAG, "Repeat User");
        loginAuthorisedUser();
    } else {
        Log.i(TAG, "New User");
        loginNewUser();
    }
}

答案 2 :(得分:0)

尝试像这样传递  twitter.buttonLogin(V,Activityname.this)

然后在这个叫做函数的改变

public void buttonLogin(View v,Context this)

{    this.getSharedPreferences(“twitterPrefs”,MODE_PRIVATE);

}