화면 회전 후 TextView 상태 복원?


104

내 앱에는 TextView및 EditText. 둘 다 데이터가 있습니다. 화면 방향이 바뀌면 EditText잔재 의 데이터가 변경 되지만 TextView데이터는 지워집니다.

누군가가 데이터를 보관하는 방법을 찾는 데 도움을 줄 수 있습니까 TextView?

답변:


221

TextView상태 를 강제 로 저장하려면 freezesText속성을 추가해야 합니다.

<TextView 
     ... 
     android:freezesText="true" />

에 대한 문서에서 freezesText:

설정된 경우 텍스트보기는 현재 커서 위치와 같은 메타 데이터와 함께 고정 된 고드름 내부에 현재 전체 텍스트를 포함합니다. 기본적으로 비활성화되어 있습니다. 텍스트 뷰의 내용이 컨텐트 제공자와 같은 영구적 인 장소에 저장되지 않을 때 유용 할 수 있습니다.


13
다른 속성 (텍스트 선택, 커서 위치 등)과 같이 기본적으로 텍스트가 '고정 / 저장'되지 않는 이유는 무엇입니까? 즉, 텍스트가 저장 되지 않는 것을 실제로 선호 하는 시나리오는 무엇 입니까?
— Gautam

3
@Gautam 내 생각에 TextViews는 XML에 저장된 정적 문자열에서 빌드되는 경우가 많으며,이 경우 시스템이 값을 기억하는 것이 중복됩니다.
— anderspitman

3
실제로 EditText 또는 TextView에 ID를 부여하면 값이 화면 회전 이벤트 중에 유지됩니다.
— DoctorFox 2015-06-15

7
@jegesh - 불행하게도이 (젤리 빈) 일부 장치에 적어도 TextViews의 경우에는 해당되지 않습니다
— 보 블라 MACHT

1
적어도이 아닌 API (17) 장치, 나를 위해 작동하지 않습니다
— Ab의

28

방향 변경에 대한 데이터를 유지하려면 두 가지 방법을 구현해야합니다.

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    // Read values from the "savedInstanceState"-object and put them in your textview
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    // Save the values you need from your textview into "outState"-object
    super.onSaveInstanceState(outState);
}

5
onCreate에서 동일한 번들을 사용할 수 있는데 왜 onRestoreInstanceState를 사용합니까?
— slott

4
@slott이 문서를 확인하십시오. developer.android.com/training/basics/activity-lifecycle/… 이것은 추측이지만 시스템이 새로운 활동을 생성하는지 또는 이전 활동을 다시 생성하는지 추적하기 때문이라고 생각합니다. onRestorySavedInstance는 드문 경우에만 호출됩니다 (메모리 제한으로 인한 구성 변경 및 활동 파괴).
— Gusdor 2015-06-14

6

1) ID가있는 모든보기가 상태를 저장하는 것은 아닙니다. 사용자가 상태를 변경할 수있는 ID가있는 Android 위젯은 소프트 킬시 상태를 저장하는 것처럼 보입니다. 따라서 EditText는 상태를 저장하지만 TextView는 소프트 킬 상태를 저장하지 않습니다.

"AFAIK, Android는 변경 될 것으로 예상되는 항목에 대해서만 상태를 저장합니다. 그렇기 때문에 텍스트를 EditText (사용자가 변경 될 가능성이 있음)에 저장하고 TextView (일반적으로 정적으로 유지됨)에 대한 상태를 저장하지 않을 수도 있습니다. ) "

마크 M

따라서 onSaveInstanceState에 textview의 상태를 저장하도록 선택하고 onCreate에서 textview의 상태를 복원하도록 선택할 수 있습니다.

2) 모범 사례는 선언하더라도 "내부"비보기 인스턴스 상태를 저장하는 것입니다.

android:configChanges= "orientation|keyboardHidden" 

문서에서 :

"그러나 응용 프로그램은 항상 이전 상태를 그대로 유지 한 상태에서 종료하고 다시 시작할 수 있어야합니다. 응용 프로그램을 다시 시작하는 것을 막을 수없는 다른 구성 변경 사항이있을뿐만 아니라 사용자가 수신 메시지를받을 때와 같은 이벤트를 처리하기 위해 전화를 건 다음 애플리케이션으로 돌아갑니다. "

JAL


6

Android는 이러한 종류의 작업을 처리하지 않습니다. 모든 데이터를 수동으로 저장했습니다.

활동에서 사용하여 값을 저장할 수 있습니다.

@Override
    public Object onRetainNonConfigurationInstance() {
        HashMap<String, Object> savedValues = new HashMap<String, Object>();
        savedValues.put("someKey", someData);           
        return savedValues;
    }

활동의 oncreate 메소드에서 이와 같은 것을 사용하여 저장된 객체를로드합니다.

HashMap < String, Object> savedValues 
     = (HashMap<String, Object>)this.getLastNonConfigurationInstance();

활동에 대한 방향 변경 비활성화를 선택할 수도 있습니다.

<activity android:name=".Activity" android:screenOrientation="portrait" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>
</activity>

android.support.v4.app.fragmentActivity에서 onRetainNonConfigurationInstance ()를 재정의 할 수 없습니다. 재정의 된 메서드가 최종입니다 !!
— Akash Dubey 2016

1

AndroidManifest.xml에서 활동을 수정하여 활동 / 활동에 다음을 추가하여 방향 변경 동작을 재정의합니다.

android:configChanges="orientation|keyboardHidden"

다음과 같이 보일 것입니다.

    <activity android:name=".activity.LoginActivity"
              android:configChanges="orientation|keyboardHidden"
              android:label="@string/app_name">
    </activity>

27
일반적으로이 접근 방식 은 문서에서 권장하지 않습니다 . "이 속성을 사용하는 것은 피하고 마지막 수단으로 만 사용해야합니다. 런타임 변경 처리를 읽으십시오 ..."
— idbrii

1

AndroidManifest.xml에 이러한 추가
의 장소에서 활동 이름을 넣어 ACTIVITY_NAME

<activity android:name="Activity_Name"
        android:screenOrientation="sensor"
        ...
        android:configChanges="orientation|keyboardHidden|screenSize">

이것은 값 변경 TextField에서도 작동합니다.


1

그냥 추가

android:configChanges="orientation|screenSize"

AndroidManifest.xml의 활동에.


-2

구성이 변경되면 Android는 기본적으로 활동을 다시 시작합니다. 이를 변경하려면 onConfigurationChanged()메서드 를 재정의해야합니다 . 또한 android:configChanges매니페스트 파일에 추가해야 합니다.

여기에서 자세한 내용을 읽을 수 있습니다 .


-7

나는 또한 사용했다

android:configChanges="orientation"

그리고 그것은 작동하지 않았습니다.

하지만 해결책을 찾았습니다.

매 니스트에 다음 줄이 올바르게 있는지 확인하십시오.

<uses-sdk android:minSdkVersion="11" android:targetSdkVersion="11" />

다음과 같은 내용을 읽지 않도록하십시오.

<uses-sdk android`:minSdkVersion="11" android:targetSdkVersion="15" />`

처음에는 두 번째 방법을 사용했지만 수정했을 때 상태가 보존되었습니다.


1
이것은 완전히 다른 것입니다. Target SDK는 앱이 대부분의 Android OS와 호환되도록하는 것입니다. 이것은 대답이 아닙니다. 어떤 의미에서는 이것이 귀하의 경우에 효과가 있었을 수도 있지만 이것은 적절한 해결책이 아닙니다.
— Rohan Kandwal 2013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.