Java 使用共享首选项在EditText中保存数字
我是android编程新手,我创建了一个简单的计算器。我希望用户能够暂停应用程序,而不会丢失在两个编辑文本框中输入的数字。我正在尝试使用共享首选项,但由于某些原因,我的应用程序不断崩溃。我怎样才能解决这个问题Java 使用共享首选项在EditText中保存数字,java,android,memory,sharedpreferences,calculator,Java,Android,Memory,Sharedpreferences,Calculator,我是android编程新手,我创建了一个简单的计算器。我希望用户能够暂停应用程序,而不会丢失在两个编辑文本框中输入的数字。我正在尝试使用共享首选项,但由于某些原因,我的应用程序不断崩溃。我怎样才能解决这个问题 package com.example.simplecalculator; import android.os.Bundle; import android.app.Activity; import android.content.SharedPreferences; import
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();
}
}
您的应用程序正在崩溃,因为您试图在为活动设置任何布局之前初始化视图。现在,按如下方式初始化…您的问题将得到解决
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);
}
您的应用程序正在崩溃,因为您试图在为活动设置任何布局之前初始化视图。现在,按如下方式初始化…您的问题将得到解决
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);
}
试试这个
您必须在onCreate
之前初始化您的EditText
,然后在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);
试试这个
您必须在onCreate
之前初始化您的EditText
,然后在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);
将其放在onCreate()内,在setContentView()之后
而且,
当SharedRef中没有存储任何内容时,第一次会发生什么
String number1 = mySharedPreferences.getString("number1", null);
String number2 = mySharedPreferences.getString("number2", null);
然后返回一些值,而不是“null”
如果经常在计算器应用程序中使用SharedRef,我建议为get和put SharedRef创建一个函数。
比如:
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);
}
如果函数在活动中,则可以全局声明该活动的上下文。否则,请在参数中传递
将其放在onCreate()内,在setContentView()之后
而且,
当SharedRef中没有存储任何内容时,第一次会发生什么
String number1 = mySharedPreferences.getString("number1", null);
String number2 = mySharedPreferences.getString("number2", null);
然后返回一些值,而不是“null”
如果经常在计算器应用程序中使用SharedRef,我建议为get和put SharedRef创建一个函数。
比如:
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);
}
如果函数在活动中,则可以全局声明该活动的上下文。否则,请在参数中传递它。您很可能会遇到空指针异常。这是因为最初当应用程序SharedReferences没有任何内容时,您倾向于访问它并从中获取一个值,当它不存在时,您将字符串值设置为NULL。当您试图在屏幕上显示空值时,它会崩溃。
这样做:
您很可能遇到空指针异常。这是因为最初当应用程序SharedReferences没有任何内容时,您倾向于访问它并从中获取一个值,当它不存在时,您将字符串值设置为NULL。当您试图在屏幕上显示空值时,它会崩溃。
这样做:
我认为你需要使用和来达到这个目的
当活动被强制终止时,会使用此选项。由于正常的应用程序行为,活动被销毁,例如用户按下后退按钮,或者您的活动通过调用finish()
或操作系统发出自己的销毁信号(例如:当您的活动在后台,另一个任务需要资源时)
。发生这种情况时,将调用onSaveInstanceState(Bundle outstate),由您的应用程序添加要保存在outstate中的任何状态数据
当用户恢复您的活动时,将调用onCreate(Bundle savedInstanceState),如果您的活动在上述场景中终止,则savedInstanceState将不为null。然后,你的应用程序可以从savedInstanceState获取数据,并将你的活动状态重新生成为用户上次看到它时的状态
基本上在onCreate中,当savedInstanceState为null时,这意味着这是活动的“新”启动。当它为非空时(如果应用程序将数据保存在onSaveInstanceState(…),则表示需要重新创建活动状态
有关它的详细信息要多得多我认为您需要为此使用和
当活动被强制终止时使用此选项。由于正常的应用程序行为,活动被销毁,例如用户按下后退按钮,或者您的活动通过调用finish()
或操作系统发出自己的销毁信号(例如:当您的活动在后台,另一个任务需要资源时)
。发生这种情况时,将调用onSaveInstanceState(Bundle outstate),并由应用程序添加要保存在outstate中的任何状态数据
当用户恢复您的活动时,将调用onCreate(Bundle savedInstanceState),如果您的活动在上述场景中终止,则savedInstanceState将不为空。然后,您的应用程序可以从savedInstanceState获取数据,并将活动的状态重新生成为用户上次看到它时的状态
基本上在onCreate中,当savedInstanceState为null时,表示这是“新”启动的活动。当它为非null时(如果应用程序将数据保存在onSaveInstanceState(…),则表示需要重新创建活动状态
是关于它的更多细节您可能会遇到NumberFormatException。这是什么?我如何修复它?再次抱歉,我是新手。您可能会遇到NumberFormatException。这是什么?我如何修复它?再次抱歉,我是新手。