片段中的Android SharedPreferences


90

我正在尝试阅读Fragment中的SharedPreferences。我的代码是我用来获取其他任何Activity的首选项的代码。

     SharedPreferences preferences = getSharedPreferences("pref", 0);

我得到错误

    Cannot make a static reference to the non-static method getSharedPreferences(String, int) from the type ContextWrapper    

我尝试遵循这些链接,但是没有通过静态方法静态SharedPreferences访问SharedPreferences的运气。谢谢您的解决方案。

Answers:


253

该方法getSharedPreferencesContext对象的方法,因此仅从a调用getSharedPreferencesFragment将不起作用...因为它不是上下文!(活动是Context的扩展,因此我们可以从中调用getSharedPreferences)。

因此,您必须通过以下方式获取应用程序上下文

// this = your fragment
SharedPreferences preferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);

1
getSharedPreferences(“ pref”,0); 零(0)意味着什么是私人/公共?
凯拉斯

@Kailas正确的模式,即WORLD_READABLE等。 developer.android.com/reference/android/content/...,INT)
Jug6ernaut

5
0类似于MODE_PRIVATE(如果在不是Context扩展的类(例如Fragment)中使用,则类似于MODE_PRIVATE)。这意味着只有相关应用可以访问首选项。您不应该使用WORLD_READABLE或WORLD_WRITEABLE,因为API 17+已弃用它们,更不用说安全威胁了。
Ankit Aggarwal,2014年

1
this做这个关键字时有必要this.getActivity().getShared..吗?
2014年

2
@Subby不,不需要显式地仅调用“ this”。我这样做是出于个人喜好,因为我讨厌模棱两可的方法调用。唯一需要“此”的时间是当您试图访问父非静态对象时,如果您不在其范围之内,而该对象位于匿名内部类/接口中。
Jug6ernaut 2014年

13

标记的答案对我不起作用,我不得不使用

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());

编辑:

或者只是尝试删除this

SharedPreferences prefs = getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);

8
标记的答案对您不起作用,因为您正在访问默认的共享首选项。更好的设计是将您的首选项不存储为共享对象,而是存储在单独的私有空间中,这就是此处的问题和答案。
zeeshan 2014年

8

请注意,我上面的用户提供的答案是正确的。

SharedPreferences preferences = this.getActivity().getSharedPreferences("pref",0);

但是,如果尝试在调用onAttach之前获取片段中的任何内容,则getActivity()将返回null。


3

您可以像这样制作片段的SharedPrefencesinonAttach方法:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    SharedPreferences preferences = context.getSharedPreferences("pref", 0);
}


1

getActivity()onAttach()在相同情况下
没有帮助我,也许我做错了,
但是!我发现另一个决定是
Context thisContext在Fragment中创建了一个字段,
并从onCreateView方法获得了当前上下文
,现在我可以使用来自fragment的共享首选项

public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {   
...   
thisContext = container.getContext();   
...   
}

1

要在Fragment中定义首选项: SharedPreferences pref = getActivity().getSharedPreferences("CargaDatosCR",Context.MODE_PRIVATE); editor.putString("credi_credito",cre); editor.commit();

调用另一个活动或分割首选项数据: SharedPreferences pref = getActivity().getSharedPreferences("CargaDatosCR", Context.MODE_PRIVATE); credit=pref.getString("credi_credito",""); if(credit.isNotEmpty)...


0

可以从内部获取上下文 Fragment

做就是了

public class YourFragment extends Fragment {

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        final View root = inflater.inflate(R.layout.yout_fragment_layout, container, false);
        // get context here
        Context context = getContext();
        // do as you please with the context


        // if you decide to go with second option
        SomeViewModel someViewModel = ViewModelProviders.of(this).get(SomeViewModel.class);
        Context context = homeViewModel.getContext();
        // do as you please with the context
        return root;
    }
}

您还可以AndroidViewModelonCreateView方法中附加一个实现返回应用程序上下文的方法的方法

public class SomeViewModel extends AndroidViewModel {

    private MutableLiveData<ArrayList<String>> someMutableData;
    Context context;

    public SomeViewModel(Application application) {
        super(application);
        context = getApplication().getApplicationContext();
        someMutableData = new MutableLiveData<>();
        .
        .
     }

     public Context getContext() {
         return context
     }
  }

0

也许这对几年后的人很有帮助。在Androidx上,SharedPreferences()进入片段的新方法是实现为gradle dependencies

implementation "androidx.preference:preference:1.1.1"

然后,在片段调用中

SharedPreferences preferences;
preferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(getActivity());
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.