【问题标题】:Use Shared Preferences inside a fragment在片段中使用共享首选项
【发布时间】:2017-08-20 09:08:59
【问题描述】:

我想在片段中使用共享首选项。检查该片段是否第一次运行,如果是,则将另一个值存储到共享首选项中。我不知道为什么它只是不起作用。这是我的代码。

String user_name;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.item_list_fragment, container, false);

    SharedPreferences sp = getActivity().getPreferences(Context.MODE_PRIVATE);
    SharedPreferences.Editor edit = sp.edit();
    if(sp.getBoolean("isFirst",true)) {
        edit.putBoolean("isFirst", false);
        edit.putString("First_Name", FirstRunActivity.username).apply();
    }

    user_name = sp.getString("First_Name","NOT WORKKING");

    TextView test = (TextView) view.findViewById(R.id.test);

    test.setText(user_name);


    }

【问题讨论】:

  • 如果 sp.getBoolean("isFirst",true) 返回 false(如果它已经设置为 false),则 if 条件不会执行,并且您没有将 First_Name 设置为 SharedPreferences。检查您是否已经有false 用于isFirst

标签: android android-fragments sharedpreferences


【解决方案1】:

从您的代码中,如果您最初没有将 isFirst 的值设置为 true,那么它将始终返回 false

if(sp.getBoolean("isFirst",true)) {
    edit.putBoolean("isFirst", false);
    edit.putString("First_Name", FirstRunActivity.username).apply();
}

你可以试试这个解决方案。

首先在你的FirstRunActivity中,你可以设置一个类成员布尔变量

private boolean inFirstActivity = true;

然后在您的 onCreate 方法中,您需要设置 SharePreference isFirst 键值,例如

if(inFirstActivity) edit.putBoolean('isFirst', true);

然后,您可以在课堂上检查代码。

if(sp.getBoolean("isFirst",true)) {
  edit.putBoolean("isFirst", false);
  edit.putString("First_Name", FirstRunActivity.username).apply();
}

【讨论】:

  • 但是“isFirst”不是一个变量,它只是要查找的 TAG 字符串(在 sharedPreferences sp 中),当该片段第一次出现时,“isFirst”将不存在,因此它必须返回真。正确的?如果我遗漏了什么,请纠正我。
  • 是的,它是一个键,但需要为键分配一个值,因为它是一个布尔值,所以它会返回 false。
【解决方案2】:
if(sp.getBoolean("isFirst",true)) { 
   edit.putBoolean("isFirst", false); 
   edit.putString("First_Name", FirstRunActivity.username).commit(); 
}

【讨论】:

  • 你好,你的意思是说我应该commit()而不是apply()。如果是,那么它仍然无法工作,两者的区别在于 apply() 在后台工作,而 commit() 立即工作。对吗?
  • 好吧.. 代码不起作用是什么意思?得到任何错误?还是将“不工作”作为价值?
  • 当我运行应用程序时,“测试”TextView 会显示我的名字(它应该显示)。当我按下后退按钮时,应用程序关闭。当我重新启动它时。它再次显示我的名字。但是,如果我从“概述”按钮关闭它。它会破坏并在重新启动时显示“NOT WORKKING”。因为它在前一种情况下工作,这意味着它存储了 FirstRunActivity.username 的值。正确的?但我的具体问题是为什么在最后一种情况下没有显示
  • 对不起,先生,我不明白。您能否用更简单的方式发表评论。 :)
  • 是的。它将 user_name 中的值设置为“NOT WORKING”。好像“First_Name”丢失了。
猜你喜欢
  • 2015-09-30
  • 2017-05-22
  • 2014-03-10
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
相关资源
最近更新 更多