我正在编写一个 Android 实验室。您需要创建一个存储帐户设置的程序。应该使用 Preferences 类在 onPause 和 onResume 函数中保存和恢复首选项。
我做了3个字段。2 个字段(名称和密码)是写为字符串的设置,第三个名为 identf 的设置是一个数字。通常使用 saveName 函数保存所有设置,但是当使用 getname 函数在屏幕上显示相同的设置时,应用程序退出。错误在数字的输出中。编译器在这两行上抛出错误。请帮我理解是什么原因。
Integer identf = settings.getInt(PREF_IDENTF, 0);
identfView.setText(identf);
下面是完整的代码。
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.a1.lab_3_1.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/nameBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Введите логин"/>
<EditText
android:id="@+id/passwordBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Введите пароль"/>
<EditText
android:id="@+id/identfBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Введите идентификатор"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Сохранить"
android:onClick="saveName"/>
<TextView
android:id="@+id/nameView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/passwordView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/identfView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Получить имя"
android:onClick="getName"/>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
package com.example.a1.lab_3_1;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private static final String PREFS_FILE = "account";
private static final String PREF_NAME = "name";
private static final String PREF_PAROL = "parol";
private static final String PREF_IDENTF = "identf";
SharedPreferences settings;
SharedPreferences.Editor prefEditor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
settings = getSharedPreferences(PREFS_FILE, MODE_PRIVATE);
}
public void saveName(View view) {
// получаем введенное имя
EditText nameBox = (EditText) findViewById(R.id.nameBox);
String name = nameBox.getText().toString();
EditText passwordBox = (EditText) findViewById(R.id.passwordBox);
String parol = passwordBox.getText().toString();
EditText identfBox = (EditText) findViewById(R.id.identfBox);
Integer identf = Integer.parseInt (identfBox.getText().toString());
// сохраняем его в настройках
SharedPreferences.Editor prefEditor = settings.edit();
prefEditor.putString(PREF_NAME, name);
prefEditor.putString(PREF_PAROL, parol);
prefEditor.putInt(PREF_IDENTF, identf);
prefEditor.apply();
}
public void getName(View view) {
// получаем сохраненное имя
TextView nameView = (TextView) findViewById(R.id.nameView);
String name = settings.getString(PREF_NAME,"не определено");
nameView.setText(name);
TextView passwordView = (TextView) findViewById(R.id.passwordView);
String parol = settings.getString(PREF_PAROL,"не определено");
passwordView.setText(parol);
TextView identfView = (TextView) findViewById(R.id.identfView);
Integer identf = settings.getInt(PREF_IDENTF, 0);
identfView.setText(identf);
}
@Override
protected void onPause(){
super.onPause();
EditText nameBox = (EditText) findViewById(R.id.nameBox);
String name = nameBox.getText().toString();
EditText passwordBox = (EditText) findViewById(R.id.passwordBox);
String parol = passwordBox.getText().toString();
EditText identfBox = (EditText) findViewById(R.id.identfBox);
Integer identf = Integer.parseInt (identfBox.getText().toString());
// сохраняем в настройках
prefEditor = settings.edit();
prefEditor.putString(PREF_NAME, nameBox.getText().toString());
prefEditor.putString(PREF_PAROL, passwordBox.getText().toString());
prefEditor.putInt(PREF_IDENTF, identf);
prefEditor.apply();
}
}
如果该方法
setText()接收一个整数作为参数,那么它认为这个数字是来自资源的字符串标识符(如R.string.text)。尽管您想获得完全不同的东西,但从编译器的角度来看,您的号码没有合适的行标识符,并且它给出了关于它的缺失的错误。
为了通过方法显示数字
setText,必须首先以任何可用的方式将其转换为字符串,例如: