Android中PreferenceManager构造方法访问权限错误求助
问题分析
你遇到的两个核心错误原因:
- 系统
android.preference.PreferenceManager的构造函数为包私有权限,无法直接通过new关键字实例化 getString()调用缺少必要参数(键名+默认值),且变量类型与实际使用场景不匹配
解决步骤
1. 修正成员变量类型
将PreferenceManager类型改为SharedPreferences(实际存储数据的容器):
// 原代码 public PreferenceManager preferenceManagers; // 修改后 public SharedPreferences preferenceManagers;
2. 修正初始化逻辑
替换所有new PreferenceManager(...)的代码,使用系统提供的静态方法获取默认SharedPreferences实例:
// 原代码(第85行、第271行) preferenceManagers = new PreferenceManager(getApplicationContext()); // 修改后 preferenceManagers = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
3. 修复getString()调用错误
SharedPreferences.getString()必须传入两个参数:存储键名、默认值(键不存在时返回),同时补全语法错误:
- 第275行(init()方法内):
// 原代码 chatAdapter = new MessagesAdapter( chatMessage, preferenceManagers.getString() ) // 修改后(替换Constants.KEY_USER_ID为你实际存储用户ID的键名) chatAdapter = new MessagesAdapter( chatMessage, preferenceManagers.getString(Constants.KEY_USER_ID, "") );
注意:末尾补充分号,修复语法缺失问题。
- 第423行(checkForConversation()方法内):
原调用缺少checkForConversationRemotely方法要求的第二个参数,同时修正getString():
// 原代码 checkForConversationRemotely( preferenceManagers.getString() ); // 修改后 checkForConversationRemotely( preferenceManagers.getString(Constants.KEY_USER_ID, ""), receiverUid );
4. 补全语法缺失
init()方法末尾缺少分号,修正后完整代码:
private void init(){ preferenceManagers = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); chatMessage = new ArrayList<>(); chatAdapter = new MessagesAdapter( chatMessage, preferenceManagers.getString(Constants.KEY_USER_ID, "") ); }
关键说明
PreferenceManager是管理SharedPreferences的工具类,本身不是数据存储容器,实际操作数据的是SharedPreferences对象,必须通过静态方法获取- 确保
Constants类中定义了对应的键名(如KEY_USER_ID),如果未定义,直接传入你实际使用的字符串键即可
内容的提问来源于stack exchange,提问作者KING
相关产品推荐
相关产品推荐

