Android 共享首选项布尔值不会在if语句中更新

Android 共享首选项布尔值不会在if语句中更新,android,firebase,sharedpreferences,Android,Firebase,Sharedpreferences,基本上,我想要实现的是,当用户点击一个按钮时,它会消失,并显示一个文本视图。因此,当用户点击按钮离开活动并返回时,它仍然应该显示文本视图,而不是按钮。为了实现这一点,我使用了SharedReferences和if-else语句,但不知何故,首选项不会得到更新。当用户点击按钮时,一切都如预期的那样,但当他离开并返回到活动时,它会再次显示该按钮,而不应该显示该按钮 我对SharedReferences的概念比较陌生,因此非常感谢您的帮助 以下是我的活动: ... private SharedPref

基本上,我想要实现的是,当用户点击一个按钮时,它会消失,并显示一个文本视图。因此,当用户点击按钮离开活动并返回时,它仍然应该显示文本视图,而不是按钮。为了实现这一点,我使用了SharedReferences和if-else语句,但不知何故,首选项不会得到更新。当用户点击按钮时,一切都如预期的那样,但当他离开并返回到活动时,它会再次显示该按钮,而不应该显示该按钮

我对SharedReferences的概念比较陌生,因此非常感谢您的帮助

以下是我的活动:

...
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
out
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);
                                    }
                                });
            }
        });
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声明中,有一个括号太多了。