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

时间:2019-11-18 18:40:20

标签: android firebase sharedpreferences

我想要实现的基本上是,当用户单击按钮时,按钮消失了,而是显示了一个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为真,我现在不知道为什么,我已经尝试了一些变体,但它仍然显示此消息。

2 个答案:

答案 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块之前读取变量并为其分配值。