조각의 Android SharedPreferences


90

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 액세스 운이 없습니다 . 모든 솔루션에 감사드립니다.

답변:


254

이 메서드 getSharedPreferencesContext객체 의 메서드 이므로 a 에서 getSharedPreferences를 호출하는 것만으로 Fragment는 작동하지 않습니다. Context가 아니기 때문입니다! (Activity는 Context의 확장이므로 getSharedPreferences를 호출 할 수 있습니다.)

따라서 응용 프로그램 컨텍스트를 가져와야합니다.

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

1
getSharedPreferences ( "pref", 0); zero (0)는 개인 / 공개 무엇을 의미합니까?
Kailas

@Kailas 올바른 모드, 즉 WORLD_READABLE 요법. developer.android.com/reference/android/content/… , int)
Jug6ernaut 2010 년

5
0은 MODE_PRIVATE (또는 Fragment와 같은 Context의 확장이 아닌 클래스 내에서 사용되는 경우 Context.MODE_PRIVATE)와 유사합니다. 이는 해당 앱만 기본 설정에 액세스 할 수 있음을 의미합니다. WORLD_READABLE 또는 WORLD_WRITEABLE은 API 17 이상에서 더 이상 사용되지 않으므로 보안 위협은 말할 것도없고 사용해서는 안됩니다.
ANKIT 가르 왈

1
할 때이 this키워드가 필요 this.getActivity().getShared..합니까?
Subby

2
@Subby no, 명시 적으로 "this"를 호출 할 필요가 없습니다. 모호한 메서드 호출이 싫기 때문에 개인적 선호도에서했습니다. "this"가 필요한 유일한 시간은 익명의 내부 클래스 / 인터페이스에있는 범위를 벗어 났을 때 부모 비 정적 개체에 액세스하려고 할 때입니다.
Jug6ernaut

14

표시된 답변이 저에게 효과가 없었습니다.

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

편집하다:

또는 다음을 제거하십시오 this.

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

8
기본 공유 환경 설정에 액세스하고 있기 때문에 표시된 답변이 작동하지 않았습니다. 더 나은 디자인은 공유 객체가 아닌 별도의 개인 공간에 기본 설정을 저장하는 것입니다. 이것이 여기에 대한 질문과 답변입니다.
zeeshan

8

주의 사항으로 위의 사용자가 제공 한이 답변은 정확합니다.

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

그러나 onAttach가 호출되기 전에 조각에서 무언가를 얻으려고 시도하면 getActivity ()가 null을 반환합니다.


3

다음 과 같이 조각 의 SharedPrefencesin onAttach메서드를 만들 수 있습니다 .

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


1

getActivity()onAttach()같은 상황에서 didnot 도움 나
어쩌면 내가 뭔가 잘못을했다
하지만! 나는 다른 결정을 발견
나는 필드를 만든 Context thisContext내 조각 내부를
그리고 방법 onCreateView에서 현재 컨텍스트를 가지고
지금은 조각에서 공유 현 작업 할 수 있습니다

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

1

조각에서 기본 설정을 정의하려면 : 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());

0

조각 kotlin에서 requiredactivity 사용

 val sharedPreferences = requireActivity().getSharedPreferences(loginmasuk.LOGIN_DATA, Context.MODE_PRIVATE)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.