我创建了一个类来处理重要的数据更改,例如App Purchase Status和其他内容。
为了实现这个目标,我创建了一个用于设置和读取值的类。但问题是每当我调用appIsPurchased()方法时,结果都是正确的,因为自应用程序安装及其首次首次启动以来它已被更改。
这是我的代码:
/**
* Created by neemasa on 5/29/14.
* This class handles more crucial data values within app.
*/
public class AppCore {
private SharedPreferences settings;
private String keyPurchase = "app_purchased";
private Context context;
public AppCore(Context context){
this.context = context;
settings = PreferenceManager.getDefaultSharedPreferences(context);
}
public void setAppInPurchasedMode(String status){
if (status.equals("successful")){
settings.edit().putBoolean(keyPurchase, true).commit();
}else if (status.equals("failed")){
settings.edit().putBoolean(keyPurchase, false).commit();
}
}
public boolean appIsPurchased(){
boolean purchased = false;
if (settings.getBoolean(keyPurchase,true)){
purchased = true;
}
return purchased;
}
}
<小时/> 问题1:我的代码有问题吗?如果有,为什么appIsPurchased()总是返回true?
同时,当我在我的代码中使用这个类时,toast&#34;已购买!&#34;即使应用程序第一次运行,也会运行。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AppCore appCore = new AppCore(getApplicationContext());
if (appCore.appIsPurchased()){
Toast.makeText(getApplicationContext(),"Purchased!",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(getApplicationContext(),"Not Purchased!",Toast.LENGTH_SHORT).show();
}
}
答案 0 :(得分:7)
找到它,问题在于我在想
settings.getBoolean(keyPurchase,false)
返回keyPurchased变量的值,但事实是它只返回变量本身而不是它的值,所以我通过将类的方法改为此来解决问题:
public boolean appIsPurchased(){
return settings.getBoolean(keyPurchase,false);
}
答案 1 :(得分:5)
实际上您的代码存在问题!这就是为什么它总是显示购买!!
if (settings.getBoolean(keyPurchase,true)){
purchased = true;
}
如果未使用keyPurchased标记,则在此行中,默认情况下,您传递的是true值 所以当你打电话
if (appCore.appIsPurchased()){
它总是返回一个真值。解决方法是确保在调用它们之前设置首选项值..希望这有帮助
答案 2 :(得分:4)
您将默认值设置为true,因此您的共享首选项不包含key_purchased的条目,或者setAppInPurchasedMode
从未被调用或称为机智状态successful
。在次要方面,你的
public boolean appIsPurchased(){
boolean purchased = false;
if (settings.getBoolean(keyPurchase,true)){
purchased = true;
}
return purchased;
}
可以像:
一样实现public boolean appIsPurchased(){
return settings.getBoolean(keyPurchase, false);
}
关于setAppInPurchasedMode
,如果我在你身边,我会改变你比较status
的方式,这样:
public void setAppInPurchasedMode(String status){
if ("successful".equals(status)){
settings.edit().putBoolean(keyPurchase, true).commit();
} else if ("failed".equals(status)){
settings.edit().putBoolean(keyPurchase, false).commit();
}
}
不同之处在于,如果status
为null,您实施的方式将使您的应用程序崩溃。通过我的实施,您将得到错误,因为"successful" instanceof
null始终为false,而instanceof
是equals
的第一次检查
答案 3 :(得分:3)
对于仍有问题的人,请记住将更改应用于您的偏好。
private SharedPreferences sharedPreferences ;
private SharedPreferences.Editor sharedPreferencesEditor;
sharedPreferencesEditor.putBoolean("myVariable", false);
sharedPreferencesEditor.apply();