Android 无法访问构造函数中的SharedReferences

Android 无法访问构造函数中的SharedReferences,android,android-preferences,Android,Android Preferences,我使用SharedReferences存储数据。当我试图从类的构造函数调用数据存储函数时,它显示了一个运行时错误。但是,当我从onCreate()调用函数时,它工作正常。 有什么方法可以从构造函数调用我的数据存储函数吗 package com.examples.storedata; import android.app.Activity; import android.content.SharedPreferences; import android.os.Bundle; import and

我使用
SharedReferences
存储数据。当我试图从类的构造函数调用数据存储函数时,它显示了一个运行时错误。但是,当我从onCreate()调用函数时,它工作正常。
有什么方法可以从构造函数调用我的数据存储函数吗

package com.examples.storedata;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;

import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Activity1 extends Activity 
{
    EditText editText1, editText2;
    TextView textSavedMem1, textSavedMem2;
    Button buttonSaveMem1, buttonSaveMem2;

    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main); 

        textSavedMem1 = (TextView)findViewById(R.id.savedmem1);
        textSavedMem2 = (TextView)findViewById(R.id.savedmem2);
        editText1 = (EditText)findViewById(R.id.edittext1);
        editText2 = (EditText)findViewById(R.id.edittext2);
        buttonSaveMem1 = (Button)findViewById(R.id.save_mem1);
        buttonSaveMem2 = (Button)findViewById(R.id.save_mem2); 
        buttonSaveMem1.setOnClickListener(buttonSaveMem1OnClickListener);
        buttonSaveMem2.setOnClickListener(buttonSaveMem2OnClickListener);
    }

    public Activity1()
    {
        LoadPreferences(); //show error while calling from here
    }

    Button.OnClickListener buttonSaveMem1OnClickListener
        = new Button.OnClickListener(){
            public void onClick(View arg0) {
                SavePreferences("MEM1", editText1.getText().toString());
                LoadPreferences();
            }
        };

    Button.OnClickListener buttonSaveMem2OnClickListener
        = new Button.OnClickListener(){
            public void onClick(View arg0) {
                SavePreferences("MEM2", editText2.getText().toString());
                LoadPreferences();
            }
        };


   private void SavePreferences(String key, String value)
   {
       SharedPreferences sharedPreferences = getPreferences(MODE_APPEND);
       SharedPreferences.Editor editor = sharedPreferences.edit();
       editor.putString(key, value);
       editor.putInt("1",5);
       editor.commit();
   }

   private void LoadPreferences()
   {
       SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
       String strSavedMem1 = sharedPreferences.getString("MEM1", "");
       String strSavedMem2 = sharedPreferences.getString("MEM2", "");
       textSavedMem1.setText(strSavedMem1);
       textSavedMem2.setText(strSavedMem2);
    }
}

这是不可能的,因为您可以在已创建的活动中获取
SharedReference
。。在这里,您甚至在构建活动(构造函数)之前就试图获得SharedReference。。要获得共享首选项,您需要
活动


你可以将值存储在构造函数中的一些实例变量中,然后将它们放入SharedReference…

这是正常的。当您的活动被创建时,例如当构造函数被称为SharePreferences时,对象还不可访问。使用/重写活动的构造函数不是好的做法。阅读了解如何使用活动。

在初始化视图或变量之前,您正在尝试访问文本视图:

textSavedMem1.setText(strSavedMem1);
textSavedMem2.setText(strSavedMem2);
从活动构造函数调用
LoadPreferences
时,
onCreate
尚未调用,这意味着
textSavedMem1
textSavedMem2
尚未初始化且为
null

当您从
onCreate
调用它时,只要它在以下内容之后,这些变量就会被初始化,并且一切都会按预期工作

setContentView(R.layout.main); 

textSavedMem1 = (TextView)findViewById(R.id.savedmem1);
textSavedMem2 = (TextView)findViewById(R.id.savedmem2);

这意味着我们没有从构造函数调用它的选项。我可以使用其他存储方法,比如SQLLite internal storage来解决这个问题。你能帮我举个例子吗?但问题是,当我声明textSavedMem1=(TextView)findViewById(R.id.savedmem1);在构造函数中,它也不起作用。那是因为构造函数不是这样做的地方。您应该只在
onCreate
中初始化UI元素。它不起作用的原因是您没有调用
setContentView
。现在,虽然从技术上讲,您可以在构造函数中实现这一点,但我希望您还有其他问题,因为在调用
onCreate
之前,Android还没有准备好让您开始处理该活动。在Android调用onCreate
之前,您实际上没有可以与之交互的活动。