화면 회전 후 TextView 상태 복원?


104

내 앱에는 TextViewEditText. 둘 다 데이터가 있습니다. 화면 방향이 바뀌면 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.