2014-02-26 28 views
-1

我是android编程的新手,我创建了一个简单的计算器。我希望用户能够暂停应用程序而不会丢失在两个EditText框中输入的数字。我正在尝试使用共享首选项,但由于某种原因,我的应用程序不断崩溃。我怎样才能解决这个问题?使用共享首选项来保存编辑文本中的数字

package com.example.simplecalculator; 

import android.os.Bundle; 


import android.app.Activity; 
import android.content.SharedPreferences; 
import android.view.Menu; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 

import com.example.simplecalculator.*; 


public class MainActivity extends Activity { 

SharedPreferences mySharedPreferences; 
SharedPreferences.Editor editor; 
public static final String MYPREFERENCES = "MyPreferences_001"; 
float answer; 
final EditText numberone = (EditText)findViewById(R.id.number1); 
final EditText numbertwo = (EditText)findViewById(R.id.number2); 

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

    mySharedPreferences = getSharedPreferences(MYPREFERENCES, 0); 
    String number1 = mySharedPreferences.getString("number1", null); 
    String number2 = mySharedPreferences.getString("number2", null); 
    numberone.setText(number1); 
    numbertwo.setText(number2); 



} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

public void Addition(View view) { 

answer = Float.parseFloat(numberone.getText().toString()) + Float.parseFloat(numbertwo.getText().toString());; 

TextView value = (TextView)findViewById(R.id.answer); 
value.setText("Your sum is " + answer); 


} 

public void Subtraction(View view) { 

answer = Float.parseFloat(numberone.getText().toString()) - Float.parseFloat(numbertwo.getText().toString());; 

TextView value = (TextView)findViewById(R.id.answer); 
value.setText("Your difference is " + answer); 

} 


public void Multiplication(View view) { 
    answer = Float.parseFloat(numberone.getText().toString()) * Float.parseFloat(numbertwo.getText().toString());; 

TextView value = (TextView)findViewById(R.id.answer); 
value.setText("Your product is " + answer); 

} 

public void Division(View view) { 

    answer = Float.parseFloat(numberone.getText().toString())/Float.parseFloat(numbertwo.getText().toString());; 

TextView value = (TextView)findViewById(R.id.answer); 
value.setText("Your quotient is " + answer); 

} 

public void Power(View view) { 
    answer = (float) Math.pow(Float.parseFloat(numberone.getText().toString()), Float.parseFloat(numbertwo.getText().toString())); 

TextView value = (TextView)findViewById(R.id.answer); 
value.setText("Your answer is " + answer); 

} 

public void Root(View view) { 

    answer = (float) Math.sqrt(Float.parseFloat(numberone.getText().toString())); 

TextView value = (TextView)findViewById(R.id.answer); 
value.setText("Your answer is " + answer); 

} 


public void onPause(){ 

    mySharedPreferences = getSharedPreferences(MYPREFERENCES, Activity.MODE_PRIVATE); 
    editor = mySharedPreferences.edit(); 
    editor.putString("number1", numberone.getText().toString()); 
    editor.putString("number2", numbertwo.getText().toString()); 
    editor.commit(); 

} 

} 
+0

您可能正在获取NumberFormatException。 – Kedarnath

+0

那是什么,我该如何解决?再次抱歉,我是新手。 – user3246935

回答

2

您的应用程序崩溃是因为您在将任何布局设置为您的活动之前尝试初始化您的视图。现在,初始化如下...你的问题将被解决。

EditText numberone; 
EditText numbertwo; 

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

    numberone = (EditText)findViewById(R.id.number1); 
    numbertwo = (EditText)findViewById(R.id.number2); 

} 
+0

这工作!谢谢!! – user3246935

+0

那你能接受答案吗? :) –

0

试试这个..

你必须用来初始化您EditText之前onCreate做内部onCreate

float answer; 
final EditText numberone; 
final EditText numbertwo; 

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

     numberone = (EditText)findViewById(R.id.number1); 
     numbertwo = (EditText)findViewById(R.id.number2); 
3
final EditText numberone = (EditText)findViewById(R.id.number1); 
final EditText numbertwo = (EditText)findViewById(R.id.number2); 

保持里面的onCreate(),之后setContentView()

而且, 什么hap第一次,当没有任何东西存储在sharedPref中时,

String number1 = mySharedPreferences.getString("number1", null); 
    String number2 = mySharedPreferences.getString("number2", null); 

返回一些值,而不是“null”。

如果使用SharedPref很经常的计算器应用程序,我建议作出了获得的功能,并把sharedPref ..
喜欢的东西:

public static void saveDataToPreferences(String key, 
      String value) { 
     SharedPreferences prefs = context.getSharedPreferences("your package name", 
       Context.MODE_PRIVATE); 
     Editor editor = prefs.edit(); 
     editor.putString(key, value); 
     editor.commit(); 
    } 
    public static String getDataFromPreferences(String key) { 

     SharedPreferences prefs = context.getSharedPreferences("your package name", 
       Context.MODE_PRIVATE); 
     return prefs.getString(key, Constants.BLANK); 
    } 

如果函数是你的活动中,为上下文该活动可以在全球范围内宣布。否则在论据中通过。

0

您正在获得NULL指针异常最有可能。它的原因是,首先当你的应用程序共享提示没有任何东西时,你倾向于访问它并从它获得一个值,当它不存在时,你设置字符串NULL的值。当您尝试在屏幕上显示NULL值时,它会崩溃。 这样做:

String number1 = mySharedPreferences.getString("number1", ""); 
String number2 = mySharedPreferences.getString("number2", ""); 
0

我认为你需要使用onSaveInstanceState()onRestoreInstanceState()用于这一目的。

当活动被activity is destroyed due to normal app behavior, such as when the user presses the Back button or your activity signals its own destruction by calling finish()the OS (ex: when your Activity is in the background and another task needs resources)强行终止时使用。发生这种情况时,onSaveInstanceState(Bundle outstate)将被调用,并且取决于您的应用程序添加要保存在outstate中的任何状态数据。

当用户恢复您的Activity时,如果您的Activity在上述场景中被终止,则onCreate(Bundle savedInstanceState)被调用并且savedInstanceState将为非null。然后,您的应用程序可以从savedInstanceState中获取数据,并将您的活动状态重新生成为用户上次看到它时的状态。

基本上在onCreate,当savedInstanceState为null时,这意味着这是一个'新鲜'启动你的活动。当它非空(如果您的应用程序将数据保存在onSaveInstanceState(...)中,则意味着需要重新创建Activity状态。

Here有关它的更详细信息