从自定义java类访问字符串资源和共享首选项

时间:2017-09-26 14:38:21

标签: android sharedpreferences

在我的Android活动中,我正在尝试构建一个自定义的java类WordPressRestApiHandler,如下所示:

public class LoginActivity extends AppCompatActivity{
    ...
    private final WordPressRestApiHandler wordPressRestApiHandler = new WordPressRestApiHandler(LoginActivity.this, service);
    ...

在该课程中,我希望能够访问字符串资源和共享首选项。这就是我使用LoginActivity.this作为输入的原因。这是我的自定义类的构造函数:

protected WordPressRestApiHandler(Context initiateContext, OAuth10aService initiateService) {
    context = initiateContext;
    service = initiateService;

    int some = R.string.PREFERENCE_FILE_KEY;
    String test = context.getString(some);

    SharedPreferences sharedPref = context.getSharedPreferences(test,Context.MODE_PRIVATE);
    ...

我能够得到一些整数,它的值是正确的,但是我无法在下一行访问字符串资源。 logcat告诉我:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
at android.content.ContextWrapper.getResources(ContextWrapper.java:86)
at android.view.ContextThemeWrapper.getResourcesInternal(ContextThemeWrapper.java:127)
at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:121)
at android.support.v7.app.AppCompatActivity.getResources(AppCompatActivity.java:549)
at android.content.Context.getString(Context.java:476)
at com.example.my_app.WordPressRestApiHandler.<init>(WordPressRestApiHandler.java:40)
at com.example.my_app.LoginActivity.<init>(LoginActivity.java:35)
at java.lang.Class.newInstance(Native Method)
at android.app.Instrumentation.newActivity(Instrumentation.java:1078)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2557)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
at android.app.ActivityThread.-wrap12(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6119) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)  

在此工作流程中,变量test将包含我的sharedPreferences文件的唯一标识符。因此它看起来像"com.example.PREFERENCE_FILE"

到目前为止,我尝试了多种方法,例如为自定义活动App.getContext().getString()调用App或在this上调用(因此类型为AppCombatActivity的对象),但没有一种方法为我工作。

1 个答案:

答案 0 :(得分:0)

你必须在onCreate()方法中初始化变量wordPressRestApiHandler。

public class LoginActivity extends AppCompatActivity{
    ...
    private WordPressRestApiHandler wordPressRestApiHandler;
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        wordPressRestApiHandler = new WordPressRestApiHandler(LoginActivity.this, service);
    }
}