내 설정에 두 가지 기본 설정이 있습니다. 1- PreferenceCategory 2-PreferenceX PreferenceX를 누르면 런타임에 PreferenceCategory에 새 기본 설정을 추가합니다. 하지만 장치를 회전하거나 응용 프로그램을 종료 한 다음 다시 열면 런타임에있는 모든 새 기본 설정을 찾을 수 없습니다. 주어진 preferenceCategory에 saveHierarchyState & restoreHierarchyState를 사용하려고했지만 여전히 작동하지 않습니다.
다음은 내 코드의 샘플입니다.
내 preferences.xml 파일 :
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:key="myCat"
android:title="Example list"
android:summary="This list is empty by default" />
<Preference
android:key="button"
android:title="Example button"
android:summary="When clicked this adds an item to the list" />
</PreferenceScreen>
내 MainActivity 코드는 다음과 같습니다.
package com.example.testpreferences;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceGroup;
public class MainActivity extends PreferenceActivity {
private int counter=0;
private PreferenceGroup pg;
/** Called when the activity is first created. */
@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
pg = (PreferenceGroup) getPreferenceScreen().findPreference("myCat");
getPreferenceScreen().findPreference("button").setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference a_preference) {
Preference preference = new Preference(getApplicationContext());
preference.setTitle("Item" + counter);
preference.setKey("key"+counter);
counter++;
pg.addPreference(preference);
return true;
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
pg.saveHierarchyState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle state) {
if (null != state) {
pg.restoreHierarchyState(state);
}else
super.onRestoreInstanceState(state);
}
}
장치를 회전하면 내가 설명하는 잘못된 동작이 발생합니다. 화면 회전시 표시되도록 런타임 중에 추가 된 새 환경 설정을 유지하려면 어떻게해야합니까?
회전하면 활동이 다시 시작됩니다.
장치를 회전하면 이런 일이 발생합니다.
onPause-> onCreate (이전 savedInstanceState 포함) ...-> onPause-> onCreate (새로운 savedInstanceState)
이는 1 회전에 대해 2 회의 활동 재부팅주기 (다른 savedInstanceState 포함)를 의미합니다.
(이 코드를 시도했습니다)
private int bootCounter = 0;
onCreate(...) { // watch savedInstanceState
if (null != savedInstanceState) {
bootCounter = savedInstanceState.getInt("bootCounter");
bootCounter++;
}
}
onSaveInstanceState(...) {
...
outState.putInt("bootCounter", bootCounter);
}
아마도 동일한 문제 :
홈 키 누르기 동작
테스트하지 않았지만 # 14, # 17에 대한 몇 가지 힌트가 있습니다 :
Issue26658 : 브라우저에서 앱을 시작할 때 활동 스택이 혼란
스럽지만 많은 힌트 :
savedInstanceState 항상 null
교대. (SharedPreferences를 사용하여 환경 설정 저장)
public class MainActivity extends PreferenceActivity
{
private int counter = 0;
private PreferenceGroup pg;
/** Called when the activity is first created. */
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Load();
getPreferenceScreen().findPreference("button").setOnPreferenceClickListener(new OnPreferenceClickListener()
{
@Override
public boolean onPreferenceClick(Preference a_preference)
{
// Preference preference = new Preference(getApplicationContext());
Preference preference = new Preference(MainActivity.this);
preference.setTitle("Item" + counter);
preference.setKey("key" + counter);
counter++;
pg.addPreference(preference);
return true;
}
});
}
private void Save()
{
SharedPreferences sharedPreferences;
Editor editor;
Preference preference;
int keyCount;
if (null != pg)
{
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
if (null != sharedPreferences)
{
editor = sharedPreferences.edit();
keyCount = pg.getPreferenceCount();
// editor.putInt("keyCount", keyCount);
// editor.putInt("counter", counter);
for (int i = 0; i < keyCount; i++)
{
preference = pg.getPreference(i);
editor.putString(preference.getKey(), preference.getTitle().toString());
}
// Save to file
// *** commit() will block caller thread ***
editor.commit();
}
}
}
@SuppressWarnings("deprecation")
private void Load()
{
SharedPreferences sharedPreferences;
Preference preference;
Map<String, ?> data;
addPreferencesFromResource(R.xml.preferences);
pg = (PreferenceGroup) getPreferenceScreen().findPreference("myCat");
counter = 0;
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
if (null != sharedPreferences)
{
// load from SharedPreferences
data = sharedPreferences.getAll();
// this doesn't keep original order
for (Entry<String, ?> kv : data.entrySet())
{
if (String.class != kv.getValue().getClass())
{
continue;
}
// fixed: getApplicationContext() causes style bug. (*1)
// preference = new Preference(getApplicationContext());
preference = new Preference(MainActivity.this);
preference.setTitle(new String((String) kv.getValue()));
preference.setKey(new String(kv.getKey()));
preference.setEnabled(true);
counter++;
pg.addPreference(preference);
}
// counter = sharedPreferences.getInt("counter", counter);
onContentChanged();
}
}
//@Override
//protected void onSaveInstanceState(Bundle outState)
//{
// super.onSaveInstanceState(outState);
//}
@Override
protected void onPause()
{
super.onPause();
Save();
}
}
(* 1) : 고정.
getApplicationContext ()를 사용하여 Preference를 만들면 항목이로드되지만 스타일 (또는 상태)이 올바르지 않습니다. (로드 된 항목을 터치하면 올바른 텍스트가 표시됩니다.)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다