Android 환경 설정 : 사용자가 환경 설정 화면을 사용하지 않았을 때 기본값을로드하는 방법은 무엇입니까?


119

사용자가 일부 값을 설정할 수 있도록 PreferenceActivity를 사용하고 있습니다. 정의 된 환경 설정으로 xml 파일을 제공하고 있습니다.

나는 android:defaultValue=""그들을 위해 모든 것을 설정 했습니다.

응용 프로그램을 시작할 때 기본 설정이 필요합니다. 아직 수동으로 설정하지 않은 경우 기본값을 원합니다.

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean value = prefs.getBoolean("key"), false); 

그러나 android:defaultValue="true"여전히 false. 따라서 XML에 설정된 defaultValues는 환경 설정 화면을 초기화 할 때 어디에도 사용되지 않는 것처럼 보입니다.

getBoolean()메서드 에서 기본값을 하드 코딩하고 싶지 않습니다 . 그래서, 이것들을 한곳에서 정의하는 것만으로 기본값을 얻는 방법이 있습니까?

답변:


169

이 질문은 저와 비슷합니다.

xml-in-main-activity에서 기본 설정 초기화

다음 코드를 onCreate방법으로 사용하십시오 .

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

XML에서 기본 설정을로드하고 마지막 매개 변수 ( readAgain)는 사용자 기본 설정을 덮어 쓰지 않도록 보장합니다. 즉, readAgain인수를로 false설정하면이 메서드가 과거에 호출 된 적이없는 경우에만 기본값이 설정되므로 활동이 생성 될 때마다 사용자 설정을 재정의하는 것에 대해 걱정할 필요가 없습니다.

추가 조사를 위해 Android API의 PreferenceManager.setDefaultValues 를 살펴보세요 .


우리가 만든 다른 SharedPrefrence 변수에 이것을 사용할 수 있습니까?
Amol Gupta 2011

8
앱이 여러 진입 점이있는 경우 또한,에 배치 onCreate()Application.
SD

2
부울을 사용하고 기본 항목이 Android 2.x에서 생성되지 않기 때문에 기본값이 "false"인 경우 작동하지 않습니다. ".getBoolean (KEY, true)"에 대한 호출은 항상 true를 반환합니다. Android 4.x의 경우 작동합니다.
Gunnar Bernstein

10
readAgaintrue로 설정 하는 것은 사용자 기본 설정을 덮어 쓰는 것과 관련이 없습니다. Javadoc에서 : 참고 : 이것은 환경 설정을 기본값으로 재설정하지 않습니다.
devconsole

1
이 솔루션에 문제가있는 경우 (작동하지 않거나 부분적으로 또는 항상 작동하지 않음) 아래의 Steve Waring의 답변 ( stackoverflow.com/a/25602205/4410376 )을 참조하십시오 . 대부분의 경우 공유 설정 파일이 여러 개있을 가능성이 높습니다. 즉, Android는 구성 또는 지저분한 코드를 기반으로 여러 공유 설정 파일을 생성합니다.
Hack06

27

사용하는 경우
getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)

기본 설정을 검색하려면 기본 설정에 사용해야 합니다!
PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)

예를 들면 :
PreferenceManager.setDefaultValues(this, PREFS_NAME, Context.MODE_PRIVATE, R.xml.preference, false);

나는 이것이 누군가를 도울 수 있기를 바랍니다.


13

Pixel의 허용 답변 :

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

그것은 것을 주장한다 false기본값을 덮어 쓸 수 없음을 의미합니다. 이것은 그것이하는 일이 아니라 애플리케이션에 둘 이상의 진입 점이있는 경우 구문 분석을 중지하는 효율성 플래그 일뿐입니다. 안타깝게도 테스트는 기본 설정 파일별로 이루어지지 않으므로 두 개 이상의 기본 설정 파일이 true있는 경우 첫 번째 파일을 제외하고 모두에서 코딩해야합니다 .

효율성이 걱정된다면 다음과 같이 코딩 할 수 있습니다.

final static private int SPL = 1;
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
if (sp.getInt("spl", 0) != SPL)
{
    PreferenceManager.setDefaultValues(this, R.xml.prefs1, true);
    PreferenceManager.setDefaultValues(this, R.xml.prefs2, true);
    sp.edit().putInt("spl", SPL).apply();
}

더 많은 공유 환경 설정을 추가 한 경우 SPL을 높은 숫자로 설정하십시오.


2
또는 기본값 설정에만 사용하는 일괄 preferences.xml을 언제든지 만들 수 있습니다. 예를 들어, 당신이있는 경우 R.xml.prefs_device, R.xml.prefs_test그리고 R.xml.prefs_admin. 위의 모든 환경 설정을 포함하는 하나의 환경 설정 파일을 만들 수 있습니다 R.xml.prefs_for_loading_default_values.. 그런 다음 사용 PreferenceManager.setDefaultValues(this, R.xml.prefs_for_loading_default_values, false);
Chantell Osejo

효율성과 관련하여 : (매니페스트에 등록 된) onCreate()하위 클래스 Application에서 이것을 호출하면 어쨌든 응용 프로그램이 시작될 때마다 한 번만 호출됩니다. 성능을 위해 앱이 시작될 때마다 구문 분석을 수행하지 않는 것이 더 적절할 것입니다 (아마도 처음 시작할 때만) false. 따라서 매번 시작할 때마다 (예 : 새로운 환경 설정이 추가 될 수있는시기) 확인이 필요한지 또는 처음 시작할 때 완료되면 (또는 환경 설정 재설정) 충분한 지에 대한 질문이 더 많습니다.
user905686

2

예를 들어 확장 DialogPreference하면 다음과 같습니다.

@Override
protected void onSetInitialValue(boolean restore, Object defaultValue) {
    super.onSetInitialValue(restore, defaultValue);

    if (restore) {
        mValue = shouldPersist() ? getPersistedString(mDefault) : mDefault;
    } else {
        mValue = mDefault;
    }
}

mDefault는 다음과 같습니다.

  • mContext.getResources (). getString (attrs.getAttributeResourceValue (androidns, "defaultValue", 100));
  • R에서 색인화 한 것.

좋아, 나는 당신이 달성하려는 것에 대해 약간 잃어 버렸습니다. DialogPreference를 호출하고 싶지 않습니다. 사용자가 Preferences를 사용하지 않을 때 기본값이 필요합니다.
Peterdk 2010-04-25

prefs.xml에서 기본 환경 설정을 사용하는 대신 고유 한 클래스를 만들 수 있습니다. 예를 들어 DialogPreference에서 확장하는 새 DialogPreference를 만들고 onSetInitialValue를 재정의 할 수 있습니다.
Macarse 2010

0

또한 이전에 SharedPreferences를 사용한 적이 없는지 확인하십시오. 변경되지 않았는지 확인하려면 (즉, setDefaultValues ​​(this, xml, false)가 효과가 없음) 앱을 제거하고 다시 업로드하여 값이 변경되지 않았는지 확인합니다. 이것은 나를 도왔다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.