97

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

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

我收到错误

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

我试图关注这些链接,但没有运气通过静态方法静态 SharedPreferences 访问 SharedPreferences。感谢您提供任何解决方案。

4

12 回答 12

273

该方法getSharedPreferencesContext对象的方法,因此仅从 a 调用 getSharedPreferences 是Fragment行不通的……因为它不是 Context!(Activity 是 Context 的扩展,所以我们可以从中调用 getSharedPreferences)。

所以你必须通过

// this = your fragment
SharedPreferences preferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);
于 2012-07-31T13:47:10.733 回答
18

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

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

编辑:

或者只是尝试删除this

SharedPreferences prefs = getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);
于 2014-07-03T09:49:57.973 回答
8

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

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

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

于 2014-02-06T15:54:21.307 回答
3

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

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    SharedPreferences preferences = context.getSharedPreferences("pref", 0);
}
于 2018-01-24T09:17:08.453 回答
2

这对我有用

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());

检查这里https://developer.android.com/guide/topics/ui/settings.html#ReadingPrefs

于 2018-02-24T22:51:11.340 回答
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)...

于 2019-07-19T16:33:20.533 回答
1

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

implementation "androidx.preference:preference:1.1.1"

然后,在片段调用内部

SharedPreferences preferences;
preferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(getActivity());
于 2020-10-09T17:44:38.653 回答
1

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

public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {   
...   
thisContext = container.getContext();   
...   
}
于 2018-08-26T21:12:37.103 回答
1

给定一个片段,您可以像这样设置 SharedPreferences:

val sharedPreferences = activity!!.applicationContext.getSharedPreferences(TAG,   Context.MODE_PRIVATE) // kotlin
SharedPreferences sharedPreferences = getActivity().getApplicationContext().getSharedPreferences(TAG,   Context.MODE_PRIVATE); // java

如果您还有其他问题,请告诉我。

于 2021-03-10T17:03:03.380 回答
0

在片段 kotlin 中使用 requiredactivity

 val sharedPreferences = requireActivity().getSharedPreferences(loginmasuk.LOGIN_DATA, Context.MODE_PRIVATE)
于 2020-11-12T16:23:18.967 回答
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
     }
  }
于 2020-06-20T22:39:04.770 回答
0

获取当前日期和时间或从中获取每个属性:

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;

String timeStamp = new SimpleDateFormat( "dd/MM/yy   HH:mm:ss").format(Calendar.getInstance().getTime());

        String timeStamp1 = new SimpleDateFormat("dd/MM/yy").format(Calendar.getInstance().getTime());
        String timeStamp2 = new SimpleDateFormat("dd").format(Calendar.getInstance().getTime());
        System.out.print(timeStamp1);
        if(timeStamp1.contains("10/03/21")) {
            System.out.print("\ntrue");
        }
        else {
            System.out.print("false");
        }
于 2021-03-10T16:56:05.870 回答