无法在构造函数中访问SharedPreferences

时间:2011-07-08 10:52:25

标签: android android-preferences

我使用SharedPreferences来存储数据。当我尝试从我的类的构造函数调用数据存储函数时,它显示运行时错误。但是,当我从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);
    }
}

3 个答案:

答案 0 :(得分:0)

它不可能,因为你可以在已经创建的活动中得到SharedPreference ..这里你甚至在活动正在建设之前尝试获得SharedPreference(构造函数)..为了获得共享偏好你需要{{1 }} ..

U可以将值存储在构造函数中的某些实例变量中,然后将它们放在SharedPreference ...

答案 1 :(得分:0)

这很正常。在创建活动时,例如,当调用构造函数时,尚无法访问SharePreferences对象。使用/覆盖activity的构造函数不是好习惯。阅读activity lifecycle以了解如何使用活动。

答案 2 :(得分:0)

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

textSavedMem1.setText(strSavedMem1);
textSavedMem2.setText(strSavedMem2);

当您从“活动”构造函数中调用LoadPreferences时,尚未调用onCreate,这意味着textSavedMem1textSavedMem2尚未初始化且为{{1} }}

当你从null调用它时,只要它在以下之后,那么这些变量就会被初始化并且一切都按预期工作。

onCreate