【问题标题】:Shared preference set in fragment, access in main activity Android在片段中设置共享首选项,在主要活动 Android 中访问
【发布时间】:2014-05-03 13:20:35
【问题描述】:

我在片段中设置了一个共享首选项值。但是当我尝试在主要活动中访问该值时,我总是得到默认值;(请告诉我为什么......

在片段中:

    reader= this.getActivity().getSharedPreferences("pref",0); // this is in onCreate

            //this part within a onClick
    editor = reader.edit();
    editor.putBoolean(Preferences.passwordOn, true); 
    editor.putString(Preferences.password, editTextPassword.getText().toString()); 
    editor.commit();

在主要活动中:

    boolean passwordOn = reader.getBoolean(Preferences.passwordOn, false);
    if(passwordOn)
    {
        Intent loginIntent=new Intent("com.sdg.etspandroidtracker.LOGIN");
        startActivity(loginIntent);
    }

更新:我的代码太乱太庞大了。 :( 所以我会告诉你那里发生了什么。

在主要活动中,首先我检查是否为应用程序设置了密码。如果是这样,我将在第二个代码部分中显示登录屏幕并结束主要活动。否则,我只保留主要活动。

在设置中,我有一个开关密码。当我打开开关时,会显示一个片段,您可以在其中输入新密码和密码确认。如果所有详细信息都正确,则密码和密码状态(设置密码时的信息)将保存在共享首选项中。这段代码是我上面给出的第一个代码部分。

我可以成功运行应用程序,并设置密码。但是当我再次运行应用程序时,不会显示登录屏幕。我调试并发现这是因为 sharedpreference 为空并给出默认值“false”,即使我上次运行应用程序时设置了密码。似乎我无法在主要活动中访问我在片段中设置的共享首选项? :\

【问题讨论】:

    标签: android android-activity fragment sharedpreferences


    【解决方案1】:

    如果你想从一个activity到一个fragment进行通信,你可以使用EventBus并发送一个可以被拦截的消息。 但是如果你的代码很乱,那可能不是一个好主意......

    【讨论】:

    • EventBus可能是个不错的选择,但我更喜欢在fragment里面写一个接口,让附加的activity实现这个接口
    【解决方案2】:

    何时MainActivity 中调用if-block 时应该查看。因为如果您在 fragment 中设置新值之前调用 if-block ,您将获得旧值。您能否提供更多代码,例如您何时调用 if-block 以及片段实际做了什么,或者何时创建?

    【讨论】:

    • 我得到了答案:这是一个非常愚蠢的错误。我在两个不同的地方使用了两个不同的键来获得共享偏好。
    • Ok :) 你应该至少使用某种类型的加密 developer.android.com/reference/android/content/… , MODE_PRIVATE 如果你看这里,你也可以找到更多关于它的信息。 :)
    【解决方案3】:

    我也遇到了同样的问题,但解决方案并不简单。我使用Butterknife 绑定资源值(在本例中,键为字符串)。

    当使用不同活动中的字符串以共享首选项调用时,它始终使用默认值。直接使用字符串就可以了。

    【讨论】:

      猜你喜欢
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 2015-09-30
      • 2015-10-09
      • 2014-03-10
      相关资源
      最近更新 更多