如何正确使用“共享首选项”在Android中存储数据?

时间:2017-01-18 22:16:18

标签: android sharedpreferences

我正在制作一个计算班级人员BMI的应用程序,其中一个要求是我们使用共享偏好将计算出的BMI发送到第二个活动。我的问题是,虽然我在运行应用程序时没有收到任何错误,但我认为没有任何错误发送。

这是我在启动时运行的主要活动。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button button = (Button)findViewById(R.id.btn1);

    final EditText Weight = (EditText)findViewById(R.id.txtWeight);
    final EditText Height = (EditText)findViewById(R.id.txtHeight);

    final SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(MainActivity.this, Main2Activity.class));

        //the bmi calculation
           // bmi = (weight * 703) / (height*height);
            bmi = weight * height;


            SharedPreferences.Editor editor = sharedPref.edit();
            editor.putInt("key1", weight);
            editor.putInt("key2", height);
            editor.putInt("key3", bmi);
            final boolean commit = editor.commit();

            }
        }
    );
}

这是我的第二个活动,它应显示从第一个活动发送的BMI。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);


    SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
    int weight = sharedPref.getInt("key1", 0);
    int height = sharedPref.getInt("key2", 0);
    int bmi = sharedPref.getInt("key3", 0);

    TextView txtBmi = (TextView) findViewById(R.id.txtBmi);


    //error here
    txtBmi.setText(Integer.toString(bmi));

当我的应用程序进入第二个屏幕时,textview中显示的唯一内容是0.如果有人可以帮我找到我的错误,那将不胜感激。

2 个答案:

答案 0 :(得分:5)

请注意,在保存数据之前无法加载数据。在您的代码中,首先启动活动然后将数据保存在SharedPreferences中。这意味着第二个活动尝试在数据被保存之前加载数据。

更重要的是,这不是解决问题的正确方法。 SharedPreferences旨在存储应用程序使用之间应持续存在的数据,例如用户名或游戏分数。要在活动之间传递数据,您应该使用Intent.putExtra()方法。

答案 1 :(得分:0)

您的代码的主要问题是您在保存共享首选项之前调用startActivity。 所以,尝试改变你的代码:

@Override
 protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button button = (Button)findViewById(R.id.btn1);

final EditText Weight = (EditText)findViewById(R.id.txtWeight);
final EditText Height = (EditText)findViewById(R.id.txtHeight);

final SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

    //the bmi calculation
       // bmi = (weight * 703) / (height*height);
        bmi = weight * height;


        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putInt("key1", weight);
        editor.putInt("key2", height);
        editor.putInt("key3", bmi);
        startActivity(new Intent(MainActivity.this, Main2Activity.class));

        }
    }
);
}