我想要实现的基本上是,当用户单击按钮时,按钮消失了,而是显示了一个TextView。因此,当用户单击该按钮离开活动并返回时,它仍应显示TextView,而不是按钮。为了实现这一点,我使用了SharedPreferences和if else语句,但是以某种方式,这些首选项没有得到更新。当用户单击按钮时,一切都按预期进行,但是当用户单击离开并返回活动时,它将再次显示该按钮不应显示的内容。
我对SharedPreferences的概念还比较陌生,因此非常感谢您的帮助!
这是我的活动:
...
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);
}
}
...
在else if语句中,它始终显示premiumPurchased
为真,我现在不知道为什么,我已经尝试了一些变体,但它仍然显示此消息。
答案 0 :(得分:1)
您必须首先根据值SharedPreferences
的内容从show/hide
中获取值。然后将onClick
外面的if-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);
}
});
}
});
答案 1 :(得分:0)
premiumPurchased = mPreferences.getBoolean (uid, true);
将此行从if else块中删除。每次创建活动时都会创建变量premiumPurchased,并且默认情况下,JVM将为其赋值。要从sharedPreference中读取数据,您需要在遇到if-else块之前读取变量并为其分配值。