2014-02-21 3 views
0

내 설정에 2 개의 환경 설정이 있습니다. 1- PreferenceCategory 2-PreferenceX PreferenceX를 누르면 런타임시 환경 설정에 PreferenceCategory에 새로운 환경 설정이 추가됩니다. 그러나 장치를 회전하거나 응용 프로그램을 종료 한 다음 다시 엽니 다. 런타임에 가지고있는 모든 새 환경 설정을 찾을 수 없습니다. 주어진 preferenceCategory에 대해 saveHierarchyState & restoreHierarchyState를 사용하려고했지만 여전히 작동하지 않습니다. 여기 Android 런타임 기기 회전시 환경 설정이 손실됩니다.

내 코드에 대한 샘플입니다

내 preferences.xml로 파일 : 장치를 회전하고 뜻에

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); 
    } 
} 

시도 : 여기

<?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 코드 내가 묘사하고있는 잘못된 행동. 런타임시 추가되는 새 환경 설정을 화면 회전시 표시되도록하려면 어떻게해야합니까?

답변

1

회전으로 인해 작업이 다시 시작됩니다.

기기를 회전하면 이러한 일이 발생합니다.
onPause ->에서 onCreate (구 savedInstanceState)와 ... -> onPause ->에서 onCreate은 1 회전에 대한 (differtent savedInstanceState)와 2 작동 재부팅주기를 의미한다 (새로운 savedInstanceState)

.

private int bootCounter = 0; 

onCreate(...) { // watch savedInstanceState 
    if (null != savedInstanceState) { 
     bootCounter = savedInstanceState.getInt("bootCounter"); 
     bootCounter++; 
    } 
} 

onSaveInstanceState(...) { 
    ... 
    outState.putInt("bootCounter", bootCounter); 
} 

아마 같은 문제 (이 코드 해봤) :
Home key press behaviour
내가 테스트하지 않은를하지만, # 14의 주위에 몇 가지 힌트, # 17이 있습니다 :
Issue26658:Activity stack confused when launching app from browser
긴 하나 하지만, 많은 힌트 :
savedInstanceState always 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()를 사용하여 환경 설정을 만드는 경우 항목이로드되지만 스타일 (또는 상태)은 올바르지 않습니다. (로드 된 항목을 만진 경우 정확한 텍스트가 표시됩니다.)

+0

답변을 주셔서 감사합니다. 위 코드에 onPause 코드를 추가했지만 작동하지 않습니다. 장치를 회전해도 새로운 추가 환경 설정이 누락되었습니다. . 또한, 내 첫 번째 코드에 따르면, onSaveInstanceState 메서드는 정상적으로 다시 호출 할 때 호출되었습니다. –

+0

업데이트 해 주셔서 감사합니다. 귀하가 제안한 대체 솔루션을 사용했기 때문에 나와 잘 작동합니다. 언급 한 버그 스타일에 대해, 나는 mehtod에서 복원하는 동안 사용 된 컨텍스트를 변경하여 문제를 해결했습니다. 기본 설정 = 새로운 기본 설정 (this); 그에 따라 답을 편집하여 정답으로 확인하고 매우 혼란 스럽기 때문에 답안의 첫 번째 부분은 필요 없다고 생각합니다. –

+0

의견을 보내 주셔서 감사합니다. 내 대답을 업데이트했습니다. – Toris

관련 문제