android利用SharedPreferences进行用户数据的回显

本文介绍了一个使用SharedPreferences进行数据存储的简单示例。示例中定义了一个PreferenceService类,该类提供了保存和读取配置参数的方法。保存方法可以将姓名和年龄写入名为'kafei'的XML文件中;而读取方法则从同一文件中读取这些信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

业务实现:

private Context context;
	public PreferenceService(Context context){
		this.context=context;
	}
	/**
	 * 保存参数
	 * @param name姓名
	 * @param age年龄
	 */
	public void save(String name, Integer age) {
		//第一个参数用于指定存放数据的XML文件的名称,指定文件的时候不要指定后缀名
		SharedPreferences preferences=context.getSharedPreferences("kafei", Context.MODE_PRIVATE);
		Editor editor=preferences.edit();
		editor.putString("name", name);
		editor.putInt("age", age);
		editor.commit();
	}
	/**
	 * 获取各项配置参数
	 * @return
	 */
	public Map<String,String> getPreferences(){
		Map<String,String> params=new HashMap<String, String>();
		SharedPreferences preferences=context.getSharedPreferences("kafei",Context.MODE_PRIVATE);
		params.put("name", preferences.getString("name", ""));
		params.put("age",String.valueOf(preferences.getInt("age",0)));
		return params;
	}
<think>我们将这个Java的LoginActivity转换为Kotlin,同时利用Kotlin的特性进行优化。 转换要点: 1. 使用Kotlin的类声明和继承语法。 2. 使用`lateinit`延迟初始化部分变量(因为我们在onCreate中初始化)。 3. 使用Kotlin的扩展函数来替代`findViewById`(或者使用View Binding,但这里为了直接转换,我们使用合成属性,但注意合成属性已被弃用,因此我们使用findViewById或者使用View Binding。不过,在转换中,我们可以先使用与Java中类似的写法,然后优化)。 4. 使用Kotlin的lambda表达式设置点击监听。 5. 使用Kotlin的字符串模板和判空方法。 6. 使用Kotlin的SharedPreferences扩展,简化操作。 注意:在Kotlin中,我们可以使用`PreferenceManager.getDefaultSharedPreferences`,也可以使用Android KTX的`preferences`扩展。 由于原Java代码中使用了BaseActivity,我们假设BaseActivity也已经转换为Kotlin。 转换步骤: 1. 将类转换为Kotlin类,并实现View.OnClickListener(但我们可以用lambda,所以这里可以去掉接口,用lambda设置监听)。 2. 使用`lateinit`声明需要延迟初始化的View。 3. 在onCreate中使用setContentView,然后初始化View。 4. 使用Kotlin的SharedPreferences操作,注意使用apply()代替commit()(因为apply是异步的,性能更好)。 但是,原代码中在onClick中使用了commit,这里我们改为apply,除非需要立即知道结果(这里不需要)。 另外,原代码中在onStart中回显用户名和密码,这里我们同样处理。 我们使用Kotlin重写: 注意:我们使用`PreferenceManager.getDefaultSharedPreferences`,也可以使用Android KTX的`preferences`,但为了不引入新库,我们使用前者。 转换后的代码:</think>以下是将 Java `LoginActivity` 转换为 Kotlin 的代码,包含现代 Kotlin 特性和最佳实践: ```kotlin class LoginActivity : BaseActivity() { private lateinit var pref: SharedPreferences private lateinit var editUser: EditText private lateinit var editPawd: EditText private lateinit var btnLogin: Button override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) pref = PreferenceManager.getDefaultSharedPreferences(this) initViews() } private fun initViews() { editUser = findViewById(R.id.edit_user) editPawd = findViewById(R.id.edit_pawd) btnLogin = findViewById(R.id.btn_login) btnLogin.setOnClickListener { handleLogin() } } override fun onStart() { super.onStart() pref.getString("user", "")?.takeIf { it.isNotEmpty() }?.let { user -> editUser.setText(user) editPawd.setText(pref.getString("pawd", "")) } } private fun handleLogin() { val user = editUser.text.toString().trim() val pawd = editPawd.text.toString().trim() when { user == "123" && pawd == "123" -> { pref.edit { putString("user", user) putString("pawd", pawd) } startActivity(Intent(this, MainActivity::class.java)) Toast.makeText(this, "哟,竟然蒙对了~", Toast.LENGTH_SHORT).show() finish() } else -> { Toast.makeText(this, "这么简单都输出,脑子呢?", Toast.LENGTH_SHORT).show() } } } } ``` ### 关键优化说明: 1. **属性声明优化** - 使用 `lateinit` 延迟初始化视图,避免空检查 - 遵循 Kotlin 命名规范(驼峰式:`editUser` 替代 `edit_user`) 2. **视图绑定简化** - 移除冗余的类型转换 `(EditText)` - 使用 lambda 表达式替代 `OnClickListener` 接口 3. **SharedPreferences 优化** ```kotlin pref.edit { putString("user", user) putString("pawd", pawd) } ``` - 使用 `edit{}` 扩展函数(来自 Android KTX) - 自动调用 `apply()` 提交(异步操作,更高效) 4. **空安全处理** ```kotlin pref.getString("user", "")?.takeIf { it.isNotEmpty() }?.let { user -> // 处理非空值 } ``` - 使用安全调用操作符 `?.` - `takeIf` 过滤空字符串 - `let` 作用域函数确保非空执行 5. **逻辑结构优化** - 使用 `when` 表达式替代嵌套 if-else - 提取 `handleLogin()` 方法分离关注点 6. **Intent 创建简化** ```kotlin Intent(this, MainActivity::class.java) ``` - 使用 Kotlin 的类引用语法 `::class.java` ### 进一步改进建议(可选) 1. **使用 View Binding** ```kotlin // 在 build.gradle 中启用 android { buildFeatures { viewBinding true } } // Activity 中使用 private lateinit var binding: ActivityLoginBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityLoginBinding.inflate(layoutInflater) setContentView(binding.root) binding.btnLogin.setOnClickListener { handleLogin() } } ``` 2. **使用密封类处理登录状态** ```kotlin sealed class LoginState { object Success : LoginState() data class Error(val message: String) : LoginState() } private fun validateLogin(): LoginState { return if (user == "123" && pawd == "123") LoginState.Success else LoginState.Error("这么简单都输出,脑子呢?") } ``` 3. **使用 DataStore 替代 SharedPreferences** ```kotlin // 在 build.gradle 添加依赖 implementation "androidx.datastore:datastore-preferences:1.0.0" // 创建 DataStore val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "login_prefs") // 存储数据 suspend fun saveCredentials(user: String, pawd: String) { dataStore.edit { prefs -> prefs[stringPreferencesKey("user")] = user prefs[stringPreferencesKey("pawd")] = pawd } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值