【问题标题】:How do I use shared preferences in a fragment on Android?如何在 Android 上的片段中使用共享首选项?
【发布时间】:2014-03-10 07:34:22
【问题描述】:

我有一个片段,我想将 Facebook id 存储在共享首选项中。我无法在获取首选项功能中编写私有模式。而且我想在另一个片段中访问这个共享偏好。我该怎么做?

这是我的代码...

Session.openActiveSession(getActivity(), true, new Session.StatusCallback()
{
    @Override
    public void call(Session session,
                     SessionState state,
                     Exception exception) {

        if (session.isOpened()) {
            Request.executeMeRequestAsync(session,new Request.GraphUserCallback() {

                @Override
                public void onCompleted(GraphUser user, Response response) {

                    if (user != null) {
                        t = (TextView)rootView.findViewById(R.id.textView2);
                        p = (ProfilePictureView)rootView.findViewById(R.id.profilePictureView1);
                        p.setProfileId(user.getId());
                        s = user.getName();
                        t.setText(s);
                        s1 = user.getId();

                        private void SavePreferences(String key,String value)
                        {
                            SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
                            SharedPreferences.Editor editor = sharedPreferences.edit();
                            editor.putString(key, value);
                            editor.commit();
                        }

【问题讨论】:

  • 改用Context.MODE_PRIVATE
  • 使用preferencemanager.getsharedpreference(context)...
  • 更正代码的格式 - (提示:没有水平滚动条等)

标签: java android facebook android-fragments sharedpreferences


【解决方案1】:

Fragment 中使用Shared Preferences;见下文。

先写SharedPreferences:

SharedPreferences pref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor edt = pref.edit();
edt.putString("facebook_id", id);
edt.commit();

这里的 id 是包含你得到的 Facebook id 的字符串,0 表示 private_mode。

其次,在另一个Fragment中读取SharedPreference中存储的Facebook id:

SharedPreferences pref = getActivity().getPreferences(Context.MODE_PRIVATE);
String id = pref.getString("facebook_id", "empty");

如果SharedPreference 内的facebook_id 为null,则此处为空。

【讨论】:

    【解决方案2】:

    你也可以点赞,

    editor = getActivity().getSharedPreferences(MY_PREFS_NAME, Context.MODE_PRIVATE).edit();
                            editor.putString("yourtextvalueKey", test);
                            editor.commit();
    

    得到

    prefs = getActivity().getSharedPreferences(MY_PREFS_NAME, Context.MODE_PRIVATE);
            text = prefs.getString("yourtextvalueKey", null);
    

    【讨论】:

      【解决方案3】:

      更新您的SavePreferences 方法如下:

      private static String MY_PREFS = "My_Preference";
      private void SavePreferences(String key, String value) {
          SharedPreferences sharedPreferences = getActivity().getSharedPreferences(
                  MY_PREFS, 0);
          SharedPreferences.Editor editor = sharedPreferences.edit();
          editor.putString(key, value);
          editor.apply();
      }
      

      【讨论】:

        【解决方案4】:
        • 创建一个单独的会话类:

          public class Session {
          private static String PREF_NAME = "Memory";
          private static String FBID = "FBID ";
          public static boolean saveSessionId(String FBID , Context context) {
          Editor editor = context.getSharedPreferences(PREF_NAME, 0).edit();
          editor.putString(FBID , FBID);
          return editor.commit();
          }
          
          public static String getSessionId(Context context) {
          SharedPreferences savedSession = context.getSharedPreferences(
                  PREF_NAME, 0);
          return savedSession.getString(FBID , null);
          }
          }
          

        要保存 ID 时调用 save 方法。然后,以同样的方式,调用getsessionid 方法获取该ID。

        【讨论】:

          【解决方案5】:
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setHasOptionsMenu(true);
              getSharedPrefs();
          }
          
          private void getSharedPrefs() {
              sharedpreferences = getActivity().getSharedPreferences(
                      Data.MY_PREFERENCES, Context.MODE_PRIVATE);
          
              // check for all to be loaded here
              boolean isValid = false;
          
              int posImage = 0;
          
              if (sharedpreferences.contains(Data.COLUMN_IMAGENUMBER)) {
                  posImage = sharedpreferences.getInt(Data.COLUMN_IMAGENUMBER, 0);
                  if (posImage >= 0 || posImage < Data.PICS.length) {
                      isValid = true;
                  }
              } else {
                  isValid = false;
              }
          }
          
          @Override
          public void onStop() {
              super.onStop();
              Editor editor = sharedpreferences.edit();
              editor.putInt(Data.COLUMN_IMAGENUMBER, cv.currentPuzzleImagePosition);
              editor.apply();
          }
          

          【讨论】:

          • lint 会告诉你考虑使用 apply
          【解决方案6】:

          试试这个代码。这对于Shared preference 来说已经足够了,无论您是在活动中工作还是Fragment,它都可以工作。 Shared preference Activity 或Fragment 都无法反映或无法生效。

          更多请点击here

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-09-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-22
            • 1970-01-01
            相关资源
            最近更新 更多