我一直潜伏在这里寻找答案,但我似乎找不到我的代码有什么问题。我有一个计算 Android 生命周期活动的程序。每次运行它时,当我尝试在 onCreate() 方法上检索数据时都会出现此错误。
private TextView numCreate;
private TextView numStart;
private TextView numResume;
private TextView numPause;
private TextView numStop;
private TextView numDestroy;
private int numc= 0;
private int nums= 0;
private int numr= 0;
private int nump= 0;
private int numst=0;
private int numd= 0;
private String pref = "MYPREFERENCES";
private String CREATE_NUM_KEY = "CREATE_NUM_KEY";
private String START_NUM_KEY = "START_NUM_KEY";
private String RESUME_NUM_KEY = "RESUME_NUM_KEY";
private String PAUSE_NUM_KEY = "PAUSE_NUM_KEY";
private String STOP_NUM_KEY = "STOP_NUM_KEY";
private String DESTROY_NUM_KEY = "DESTROY_NUM_KEY";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lifecycle);
numCreate= findViewById(R.id.ocreateview);
logContainer= findViewById(R.id.logContainer);
sharedPref= getSharedPreferences(pref,Context.MODE_PRIVATE);
numc = sharedPref.getInt(CREATE_NUM_KEY,0);
nums = sharedPref.getInt(START_NUM_KEY,0);
numr = sharedPref.getInt(RESUME_NUM_KEY,0);
nump = sharedPref.getInt(PAUSE_NUM_KEY,0);
numst = sharedPref.getInt(STOP_NUM_KEY,0);
numd = sharedPref.getInt(DESTROY_NUM_KEY,0);
numStart.setText(getNum(nums));
numResume.setText(getNum(numr));
numPause.setText(getNum(nump));
numStop.setText(getNum(numst));
numDestroy.setText(getNum(numd));
logContainer.append("Triggered onCreate()!");
logContainer.append("\n\r");
numc++;
numCreate.setText(getNum(numc));
String tstamp = timestamp();
tCreate.setText(tstamp);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(CREATE_NUM_KEY, numc);
editor.commit();
editor.apply();
}
“numc = sharedPref.getInt(CREATE_NUM_KEY,0);”这一行的错误点消息“java.lang.String 无法转换为 java.lang.Integer”。谢谢
方法
getSharedPreferences()
返回SharedPreferences
,它基本上是一个Map
和一个Map
包含键和值,在SharedPreferences
的情况下,值可以是任何东西,这意味着它不必是一个int
.看起来键 CREATE_NUM_KEY
的值是 String
而不是 Integer
。是什么让你认为这是Integer
?
在 Kotlin 中有同样的错误:
java.lang.String cannot be cast to java.lang.Integer at android.app.SharedPreferencesImpl.getInt
.SharedPreference
键;其中一个表示为String
类型值。因此,当我尝试访问 SharedPreference Map Int
键时,重复的 String
键被转换为预期的 Int
导致错误。例如:
val PREFS_BASE_DIR = "com.example.example"
val PREFS_FILENAME = "$PREFS_BASE_DIR.utils.prefs"
private val CREATE_NUM_KEY = "CREATE_NUM_KEY"
private val CREATE_START_KEY = "CREATE_NUM_KEY" // Duplicate key
private val prefs: SharedPreferences = context.getSharedPreferences(PREFS_FILENAME, Context.MODE_PRIVATE)
var num: String
get() = prefs.getString(CREATE_NUM_KEY, "") ?: ""
set(value) = prefs.edit().putString(CREATE_NUM_KEY, value).apply()
var start: Int
get() {
return prefs.getInt(CREATE_START_KEY,0)
}
set(value) = prefs.edit().putInt(CREATE_START_KEY, value!!).apply()
在您的代码中没有看到相同的错误。但它会让你不知所措。