Android 런타임 환경 설정이 기기 회전시 손실 됨

와엘 쇼 에어

내 설정에 두 가지 기본 설정이 있습니다. 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Android Studio : 공유 환경 설정 초기화로 인해 활동 시작이 중단됨

분류에서Dev

런타임 오류 424 경고없이 시작됨

분류에서Dev

마시멜로에서 런타임에 전화 상태 읽기 권한을 요청할 때 앱이 닫히고 배경이 검은 색으로 표시됨

분류에서Dev

Android- 실행 시간 동안보기 높이가 변경됨

분류에서Dev

런타임 중에 "cl_version.h : CL_TARGET_OPENCL_VERSION이 정의되지 않았습니다. 기본값은 220 (OpenCL 2.2)으로 설정 됨"경고가 표시됨

분류에서Dev

Lollipop 이전 기기의 Android 환경 설정 헤더 여백

분류에서Dev

Android : 런타임에서 엄지 손가락으로 이미지 읽기

분류에서Dev

Raspberry Pi를 다시 시작하기 직전에 AJAX 응답이 손실 됨

분류에서Dev

런타임 중 iCloud 동기화 전환

분류에서Dev

런타임 오류 : 전제 조건 실패 : 속성이 초기 값을 설정하지 못했습니다.

분류에서Dev

바닥 글 크기를 조정하는 동안 열 배경색이 손실 됨

분류에서Dev

정렬시 NEST Search 메타 데이터가 손실 됨

분류에서Dev

UserControl 런타임시 크기 조정

분류에서Dev

Java, SWT, 크기 조정시 이미지 투명도가 손실 됨

분류에서Dev

Android에서 스크롤 할 때 목록보기 edittext 데이터가 손실 됨

분류에서Dev

Android 애플리케이션 실행시 런타임 오류

분류에서Dev

Android에서 런타임시 체크 박스 이름 가져 오기

분류에서Dev

Xcode 6 베타 : Spritekit 편집기에서 스프라이트가 손실 됨

분류에서Dev

인터넷 연결이 런타임에 손실 된 경우 확인

분류에서Dev

런타임 환경이 Spring Tool Suite (STS)에서 비활성화 됨

분류에서Dev

페이지 변경시 Aspxgridview 명령 열의 값이 손실 됨

분류에서Dev

프로그래밍 전환으로 탐색 표시 줄이 손실 됨

분류에서Dev

kotlin 코드의 런타임 컴파일에서 RuntimeException이 발생 함 (경고 : Windows 용 기본 파일 시스템 초기화 실패)

분류에서Dev

glib 2.0 및 Gstreamer 컴파일 후 시스템 기능이 손실 됨

분류에서Dev

런타임시 버튼 숨기기 / 보이기

분류에서Dev

런타임시 텍스트 모드 / 바이너리 모드 간 Java 읽기 직렬 포트 전환

분류에서Dev

런타임 중에 JFrame 크기가 의도하지 않게 변경됨

분류에서Dev

응답이 반환 된 후 RequestContextHolder에 설정된 속성이 손실 됨

분류에서Dev

Android 런타임시 strings.xml에서 모든 언어 읽기

Related 관련 기사

  1. 1

    Android Studio : 공유 환경 설정 초기화로 인해 활동 시작이 중단됨

  2. 2

    런타임 오류 424 경고없이 시작됨

  3. 3

    마시멜로에서 런타임에 전화 상태 읽기 권한을 요청할 때 앱이 닫히고 배경이 검은 색으로 표시됨

  4. 4

    Android- 실행 시간 동안보기 높이가 변경됨

  5. 5

    런타임 중에 "cl_version.h : CL_TARGET_OPENCL_VERSION이 정의되지 않았습니다. 기본값은 220 (OpenCL 2.2)으로 설정 됨"경고가 표시됨

  6. 6

    Lollipop 이전 기기의 Android 환경 설정 헤더 여백

  7. 7

    Android : 런타임에서 엄지 손가락으로 이미지 읽기

  8. 8

    Raspberry Pi를 다시 시작하기 직전에 AJAX 응답이 손실 됨

  9. 9

    런타임 중 iCloud 동기화 전환

  10. 10

    런타임 오류 : 전제 조건 실패 : 속성이 초기 값을 설정하지 못했습니다.

  11. 11

    바닥 글 크기를 조정하는 동안 열 배경색이 손실 됨

  12. 12

    정렬시 NEST Search 메타 데이터가 손실 됨

  13. 13

    UserControl 런타임시 크기 조정

  14. 14

    Java, SWT, 크기 조정시 이미지 투명도가 손실 됨

  15. 15

    Android에서 스크롤 할 때 목록보기 edittext 데이터가 손실 됨

  16. 16

    Android 애플리케이션 실행시 런타임 오류

  17. 17

    Android에서 런타임시 체크 박스 이름 가져 오기

  18. 18

    Xcode 6 베타 : Spritekit 편집기에서 스프라이트가 손실 됨

  19. 19

    인터넷 연결이 런타임에 손실 된 경우 확인

  20. 20

    런타임 환경이 Spring Tool Suite (STS)에서 비활성화 됨

  21. 21

    페이지 변경시 Aspxgridview 명령 열의 값이 손실 됨

  22. 22

    프로그래밍 전환으로 탐색 표시 줄이 손실 됨

  23. 23

    kotlin 코드의 런타임 컴파일에서 RuntimeException이 발생 함 (경고 : Windows 용 기본 파일 시스템 초기화 실패)

  24. 24

    glib 2.0 및 Gstreamer 컴파일 후 시스템 기능이 손실 됨

  25. 25

    런타임시 버튼 숨기기 / 보이기

  26. 26

    런타임시 텍스트 모드 / 바이너리 모드 간 Java 읽기 직렬 포트 전환

  27. 27

    런타임 중에 JFrame 크기가 의도하지 않게 변경됨

  28. 28

    응답이 반환 된 후 RequestContextHolder에 설정된 속성이 손실 됨

  29. 29

    Android 런타임시 strings.xml에서 모든 언어 읽기

뜨겁다태그

보관