我正在研究部分用Kotlin和部分用Java构建的android项目。我试图将信息从Kotlin片段类传递给Java类。我发现信息传递存在问题,因为我没有收到所需的价值。经过一些调试后,我看到信息已成功存储,但是访问共享首选项中的信息时,仅返回默认值。
这是kotlin类中的代码。单击按钮后,它将布尔变量的值更改为相反的值,将按钮的文本设置为true / false,并将该变量的值保存在共享首选项中。
btnStyle.setOnClickListener() {
styleHasChanged = !styleHasChanged;
if(styleHasChanged == true){
btnStyle.setText("true")
}else{
btnStyle.setText("false")
}
val sharedPref : SharedPreferences?= activity?.getPreferences(MODE_PRIVATE);
sharedPref?.edit()?.putBoolean("bla", styleHasChanged)?.apply()
}
这是java类。共享首选项在函数内调用,该函数根据接收到的值选择文件路径。
public static String getHtmlContent(Context context, String htmlContent, Config config) {
SharedPreferences sharedPreferences = context.getSharedPreferences("bla",MODE_PRIVATE);
boolean hasStyleChanged = sharedPreferences.getBoolean("bla", false);
//moj
String cssPath;
if (!hasStyleChanged) {
cssPath = String.format(context.getString(R.string.css_tag), "file:///android_asset/css/Style.css");
} else {
cssPath = String.format(context.getString(R.string.css_tag), "file:///android_asset/css/Style2.css");
}
这是出现问题的地方。不论是否单击按钮,java类中的共享首选项始终会获取默认值。
答案 0 :(得分:1)
即使使用context.getSharedPreferences("PreferencesFileName",MODE_PRIVATE)
,您的activity?.getPreferences("PreferencesFileName",MODE_PRIVATE)
也应该相同。在您的代码中并不是这样。
加上一个简单的建议,因为我不确定您是否清楚。 bla
是您的boolean
值的键,而不是“首选项”文件名。我的意思是可以的,但是最好分开。
答案 1 :(得分:1)
getPreferences
方法隐式使用Activity
的类名作为首选项文件名。通过将"bla"
作为文件名传递到getSharedPreferences
,您试图从另一个文件中获取保存的值。
如果您希望在整个应用程序中访问相同的首选项,则可以将getSharedPreferences
(用于写入和读取首选项)与相同文件名一起使用,或使用{ PreferenceManager
的{3}}静态方法来获取默认的SharedPreferences
实例。
您应该将代码更改为以下内容:
val sharedPref : SharedPreferences? = activity?
.getSharedPreferences("someFileName", MODE_PRIVATE)
sharedPref?.edit()?.putBoolean("bla", styleHasChanged)?.apply()
还有Java部分:
SharedPreferences sharedPreferences = context
.getSharedPreferences("someFileName", MODE_PRIVATE);
boolean hasStyleChanged = sharedPreferences.getBoolean("bla", false);