Android 共享首选项布尔值不会在if语句中更新
基本上,我想要实现的是,当用户点击一个按钮时,它会消失,并显示一个文本视图。因此,当用户点击按钮离开活动并返回时,它仍然应该显示文本视图,而不是按钮。为了实现这一点,我使用了SharedReferences和if-else语句,但不知何故,首选项不会得到更新。当用户点击按钮时,一切都如预期的那样,但当他离开并返回到活动时,它会再次显示该按钮,而不应该显示该按钮 我对SharedReferences的概念比较陌生,因此非常感谢您的帮助 以下是我的活动:Android 共享首选项布尔值不会在if语句中更新,android,firebase,sharedpreferences,Android,Firebase,Sharedpreferences,基本上,我想要实现的是,当用户点击一个按钮时,它会消失,并显示一个文本视图。因此,当用户点击按钮离开活动并返回时,它仍然应该显示文本视图,而不是按钮。为了实现这一点,我使用了SharedReferences和if-else语句,但不知何故,首选项不会得到更新。当用户点击按钮时,一切都如预期的那样,但当他离开并返回到活动时,它会再次显示该按钮,而不应该显示该按钮 我对SharedReferences的概念比较陌生,因此非常感谢您的帮助 以下是我的活动: ... private SharedPref
...
private SharedPreferences mPreferences;
private boolean premiumPurchased;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_premium_purchase);
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String username = user.getDisplayName();
purchase = findViewById(R.id.card_view_premium_purchase);
premiumTextView = findViewById(R.id.premium_purchase_success);
mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
if (!premiumPurchased){
String uid = user.getUid();
premiumPurchased = mPreferences.getBoolean (uid, true);
premiumTextView.setVisibility(View.GONE);
purchase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DocumentReference userRef = db.collection("User").document(username);
// Set the "pro membership" in Firestore to true
userRef
.update("pro membership", true).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
premiumTextView.setVisibility(View.VISIBLE);
purchase.setVisibility(View.GONE);
SharedPreferences.Editor editor = mPreferences.edit();
editor.putBoolean(uid, true);
editor.apply();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "Error updating document", e);
}
});
}
});
}else if (premiumPurchased) {
premiumTextView.setVisibility(View.VISIBLE);
purchase.setVisibility(View.GONE);
}
}
...
。。。
私人共享参考文献;
私有布尔预购买;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u premium\u purchase);
FirebaseUser=FirebaseAuth.getInstance().getCurrentUser();
字符串username=user.getDisplayName();
购买=findViewById(R.id.card\u view\u premium\u purchase);
premiumTextView=findViewById(R.id.premium\u purchase\u success);
mPreferences=PreferenceManager.getDefaultSharedReferences(此);
如果(!premiumPurchased){
字符串uid=user.getUid();
premiumPurchased=mPreferences.getBoolean(uid,true);
premiumTextView.setVisibility(View.GONE);
purchase.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
DocumentReference userRef=db.collection(“用户”).document(用户名);
//将Firestore中的“专业会员资格”设置为true
用户参考
.update(“pro membership”,true).addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时公开作废(作废避免){
premiumTextView.setVisibility(View.VISIBLE);
purchase.setVisibility(View.GONE);
SharedReferences.Editor=mPreferences.edit();
putBoolean(uid,true);
editor.apply();
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.w(标签“错误更新文档”,e);
}
});
}
});
}否则,如果(预购){
premiumTextView.setVisibility(View.VISIBLE);
purchase.setVisibility(View.GONE);
}
}
...
在else if语句中,它始终显示premiumPurchased
,我现在不知道为什么,我已经尝试了一些变体,但它仍然显示此消息
premiumPurchased = mPreferences.getBoolean (uid, true);
将这条线从if-else块中取出。每次创建活动时都会创建变量premiumPurchased,默认情况下JVM将为其提供值。要从SharedReference读取值,您需要在遇到if-else块之前读取并为变量赋值。您必须首先从
SharedReferences
获取值,并基于值显示/隐藏
内容。同时拉出onClick
outif-else
,保持状况清洁
尝试以下方法:
String uid = user.getUid();
mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
premiumPurchased = mPreferences.getBoolean (uid, false);
if (premiumPurchased) {
premiumTextView.setVisibility(View.VISIBLE);
purchase.setVisibility(View.GONE);
} else {
purchase.setVisibility(View.VISIBLE);
premiumTextView.setVisibility(View.GONE);
}
....
purchase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DocumentReference userRef = db.collection("User").document(username);
// Set the "pro membership" in Firestore to true
userRef
.update("pro membership", true).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
premiumTextView.setVisibility(View.VISIBLE);
purchase.setVisibility(View.GONE);
SharedPreferences.Editor editor = mPreferences.edit();
editor.putBoolean(uid, true);
editor.apply();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "Error updating document", e);
}
});
}
});
String uid=user.getUid();
mPreferences=PreferenceManager.getDefaultSharedReferences(此);
premiumPurchased=mPreferences.getBoolean(uid,false);
如果(预购){
premiumTextView.setVisibility(View.VISIBLE);
purchase.setVisibility(View.GONE);
}否则{
purchase.setVisibility(View.VISIBLE);
premiumTextView.setVisibility(View.GONE);
}
....
purchase.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
DocumentReference userRef=db.collection(“用户”).document(用户名);
//将Firestore中的“专业会员资格”设置为true
用户参考
.update(“pro membership”,true).addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时公开作废(作废避免){
premiumTextView.setVisibility(View.VISIBLE);
purchase.setVisibility(View.GONE);
SharedReferences.Editor=mPreferences.edit();
putBoolean(uid,true);
editor.apply();
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.w(标签“错误更新文档”,e);
}
});
}
});
@Kaiser,你检查过这个了吗?是的,谢谢,这个很好用。在你的else声明中,有一个括号太多了。