Android의 PreferenceActivity에서 SharedPreference를 가져 오려면 어떻게합니까?


373

PreferenceActivity를 사용하여 응용 프로그램의 일부 설정을 보여줍니다. onCreate (및 완전한 클래스 메서드)가 다음과 같이 보이도록 xml 파일을 통해 설정을 팽창시킵니다.

public class FooActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        addPreferencesFromResource(R.xml.preference);
    }
}

의 javadoc는 PreferenceActivity를 PreferenceFragment는 것을 말한다

이러한 환경 설정은 사용자가 상호 작용할 때 SharedPreferences에 자동으로 저장됩니다. 이 활동의 ​​환경 설정 계층이 사용할 SharedPreferences 인스턴스를 검색하려면이 활동과 동일한 패키지의 컨텍스트로 getDefaultSharedPreferences (android.content.Context)를 호출하십시오.

그러나 다른 활동에서 SharedPreference의 이름을 어떻게 얻습니까? 나는 전화 만 할 수있다

getSharedPreferences(name, mode)

다른 활동에서 PreferenceActivity에서 사용한 SharedPreference의 이름이 필요합니다. 이름은 무엇입니까? 어떻게 검색 할 수 있습니까?

답변:


721
import android.preference.PreferenceManager;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
// then you use
prefs.getBoolean("keystring", true);

최신 정보

에 따르면 공유 환경 설정 | Sai Geetha MN의 Android 개발자 튜토리얼 (13 부) ,

많은 애플리케이션이 특정 애플리케이션 또는 활동의 설정에서 사용자 환경 설정을 캡처하는 방법을 제공 할 수 있습니다. 이를 지원하기 위해 Android는 간단한 API 세트를 제공합니다.

환경 설정은 일반적으로 이름 값 쌍입니다. 응용 프로그램의 다양한 활동에서 "공유 환경 설정"으로 저장할 수 있습니다 (현재 프로세스간에 공유 할 수는 없습니다). 또는 활동별로 저장해야 할 수도 있습니다.

  1. 공유 기본 설정 : 공유 기본 설정은 응용 프로그램의 모든 구성 요소 (활동, 서비스 등)에서 사용할 수 있습니다.

  2. 활동 처리 환경 설정 : 이러한 환경 설정은 특정 활동 내에서만 사용할 수 있으며 응용 프로그램의 다른 구성 요소에서는 사용할 수 없습니다.

공유 환경 설정 :

공유 환경 설정은 클래스 의 getSharedPreferences메소드를 사용하여 관리됩니다 Context. 기본 설정은 기본 파일 (1)에 저장 되거나 기본 설정을 참조하는 데 사용할 파일 이름 (2) 을 지정할 수 있습니다 .

(1) 권장되는 방법 은 파일 이름을 지정하지 않고 기본 모드에서 사용하는 것입니다

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

(2) 파일 이름을 지정할 때 인스턴스를 얻는 방법은 다음과 같습니다.

public static final String PREF_FILE_NAME = "PrefFile";
SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);

MODE_PRIVATE기본 설정의 작동 모드입니다. 기본 모드이며 생성 된 파일이 호출 응용 프로그램에서만 액세스됨을 의미합니다. 지원되는 다른 두 가지 모드는 MODE_WORLD_READABLEMODE_WORLD_WRITEABLE입니다. MODE_WORLD_READABLE다른 응용 프로그램 에서는 작성된 파일을 읽을 수는 있지만 수정할 수는 없습니다. MODE_WORLD_WRITEABLE다른 응용 프로그램의 경우 에도 작성된 파일에 대한 쓰기 권한이 있습니다.

마지막으로 환경 설정 인스턴스가 있으면 환경 설정에서 저장된 값검색하는 방법은 다음과 같습니다.

int storedPreference = preferences.getInt("storedInt", 0);

환경 설정 파일에 저장 하려면 SharedPreference.Editor오브젝트를 사용해야합니다. 클래스 Editor에서 중첩 된 인터페이스입니다 SharedPreference.

SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

편집기는 파일에서 환경 설정 값 remove()과 같은 및 clear()삭제 방법도 지원 합니다.

활동 환경 설정 :

공유 기본 설정은 다른 응용 프로그램 구성 요소에서 사용할 수 있습니다. 그러나 다른 구성 요소와 환경 설정을 공유 할 필요가없고 활동 개인 환경 설정을 원하는 경우 활동 getPreferences()방법 을 사용하여이를 수행 할 수 있습니다 . 이 getPreference메소드는 getSharedPreferences()환경 설정 파일 이름에 대한 활동 클래스 이름과 함께 메소드를 사용합니다 .

다음은 환경 설정을 얻는 코드입니다

SharedPreferences preferences = getPreferences(MODE_PRIVATE);
int storedPreference = preferences.getInt("storedInt", 0);

값을 저장하는 코드는 공유 환경 설정의 경우와 동일합니다.

SharedPreferences preferences = getPreference(MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

데이터베이스에 활동 상태 저장과 같은 다른 방법을 사용할 수도 있습니다. 참고 Android에는이라는 패키지도 포함되어 있습니다 android.preference. 패키지는 애플리케이션 환경 설정 UI를 구현하기위한 클래스를 정의합니다.

더 많은 예제를 보려면 개발자 사이트에서 Android의 데이터 스토리지 게시물을 확인 하십시오.


55
+1 : u는 하루를 구했습니다. 인터넷에 대한 자습서 / 예는 이것에 대해 말하지 않습니다. 그들은 모두 abt 기능과 사용자 정의를 말하지만 읽는 방법은 아닙니다.
ankitjaininfo

1
답변의 내 업데이트를 참조하십시오. 파일 이름은 비슷 package.prefs하지만 확실하지 않습니다.
Pentium10

1
코드 주셔서 감사합니다. 나를 혼란스럽게하는 한 가지 작은 것이 있습니다 : SharedPreference는 인터페이스이므로 메소드 호출을 처리하는 실제 코드는 어디에 구현됩니까?
x1886x

1
SE 전체에서 어리석은 대단하다 답변 / 의견을 읽는 데 시간을 낭비하기 전에 일주일을 읽었 으면 좋겠습니다. SE는 실제로 그들이하지 않을 때를 알고 있다고 생각합니다 .. @ Pentium10 감사합니다. :)
Sanjeevcn

1
editor.commit ()를 사용하는 대신 editor.apply ()를 사용할 수도 있습니다. 차이점은 commit ()은 변경 사항을 동 기적으로 작성하고 apply는 비동기 적으로 변경 사항을 작성한다는 것입니다. UI가 더 빨라집니다.
Hashim Akhtar

29

에 액세스 getDefaultSharedPreferenes()할 수없는 경우 getSharedPreferences(name, mode)대신 사용할 수 있으며 올바른 이름 만 전달하면됩니다.

Android는이 이름을 생성합니다 (프로젝트의 패키지 이름을 기반으로 할 수 있습니까?). 당신은 다음 코드를 넣어 그것을 얻을 수 SettingsActivity onCreate(), 무엇을보고 preferencesName있다.

String preferencesName = this.getPreferenceManager().getSharedPreferencesName();

문자열은 다음과 같아야 com.example.projectname_preferences합니다. 프로젝트 어딘가에 하드 코드를 전달하고 전달하면 getSharedPreferences()좋을 것입니다.


1
활동의 소스는 다음과 같습니다. public SharedPreferences getPreferences (int mode) {return getSharedPreferences (getLocalClassName (), mode); }

22

이 방법들을 먼저 선언하십시오 ..

public static void putPref(String key, String value, Context context) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(key, value);
    editor.commit();
}

public static String getPref(String key, Context context) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(key, null);
}

그런 다음 준비를 할 때 이것을 호출하십시오.

putPref("myKey", "mystring", getApplicationContext());

준비를 원할 때 이것을 호출하십시오.

getPref("myKey", getApplicationContext());

아니면 이 개체를 사용할 수 있습니다 https://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo 를 모든 것을 더욱 단순화

예:

TinyDB tinydb = new TinyDB(context);

tinydb.putInt("clickCount", 2);
tinydb.putFloat("xPoint", 3.6f);
tinydb.putLong("userCount", 39832L);

tinydb.putString("userName", "john");
tinydb.putBoolean("isUserMale", true); 

tinydb.putList("MyUsers", mUsersArray);
tinydb.putImagePNG("DropBox/WorkImages", "MeAtlunch.png", lunchBitmap);

editor.apply ()를 사용하지 않는 이유; 대신 백그라운드에서 처리 커밋
아비 Parshan에게

4

모든 곳에서 컨텍스트를 전달해야하는 것은 정말 짜증납니다. 코드가 너무 장황하고 관리가 불가능 해집니다. 대신 모든 프로젝트 에서이 작업을 수행합니다 ...

public class global {
    public static Activity globalContext = null;

메인 액티비티에서 설정

@Override
public void onCreate(Bundle savedInstanceState) {
    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(
            global.sdcardPath,
            ""));
    super.onCreate(savedInstanceState);

    //Start 
    //Debug.startMethodTracing("appname.Trace1");

    global.globalContext = this;

또한 모든 환경 설정 키는 언어 독립적이어야합니다. 아무도 언급하지 않은 충격입니다.

getText(R.string.yourPrefKeyName).toString()

이제 한 줄의 코드에서 이와 같이 아주 간단하게 호출하십시오.

global.globalContext.getSharedPreferences(global.APPNAME_PREF, global.MODE_PRIVATE).getBoolean("isMetric", true);

4
키 언어를 독립적으로 만들면 어떤 이점이 있습니까? 그들은 사용자에게 표시되지 않습니다.
Gerd

1
신의 사랑을 위해 활동을 글로벌 맥락으로 사용하지 마십시오. 글로벌 컨텍스트를 사용해야하는 경우 사용자 정의 애플리케이션 클래스를 사용하십시오.
Thorben

1
@Thorben 합의. 또는 간단히getApplicationContext()
OneCricketeer

3

확인란이 있고 자바 파일에서 값을 가져 오려면 true / false입니다.

사용하다--

Context mContext;
boolean checkFlag;

checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);`

0

2019 업데이트

당신은 단순히 PowerPreference라이브러리 를 사용할 수 있습니다

https://github.com/AliEsaAssadi/Android-Power-Preference

공유 환경 설정 인스턴스 가져 오기

기본 인스턴스를 얻으려면 전화해야합니다.

PowerPreference.getDefaultFile()

또는 특정 환경 설정 파일을 원하는 경우

PowerPreference.getFileByName(fileName)

데이터 쓰기 :

PowerPreference.getDefaultFile().put(key,value)

데이터 얻기

PowerPreference.getDefaultFile().getString(key,value)

PowerPreference는 컨텍스트 부분을 어떻게 처리합니까? 공유 환경 설정을 읽으려면 컨텍스트가 필요합니까? 저는 Android를 처음 사용하고 이해하려고합니다.
Yeti

0

나를 위해 일한 소스 코드를 따라보십시오.

//Fetching id from shared preferences
    SharedPreferences sharedPreferences;
    sharedPreferences =getSharedPreferences(Constant.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    getUserLogin = sharedPreferences.getString(Constant.ID_SHARED_PREF, "");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.