ในแอปของฉันฉันมีTextView
และEditText
. ทั้งสองมีข้อมูลอยู่ในนั้น เมื่อการวางแนวหน้าจอเปลี่ยนข้อมูลในส่วนที่EditText
เหลือ แต่TextView
ข้อมูลจะถูกล้าง
มีใครช่วยหาวิธีเก็บรักษาข้อมูลTextView
ด้วยได้ไหม
ในแอปของฉันฉันมีTextView
และEditText
. ทั้งสองมีข้อมูลอยู่ในนั้น เมื่อการวางแนวหน้าจอเปลี่ยนข้อมูลในส่วนที่EditText
เหลือ แต่TextView
ข้อมูลจะถูกล้าง
มีใครช่วยหาวิธีเก็บรักษาข้อมูลTextView
ด้วยได้ไหม
คำตอบ:
หากคุณต้องการบังคับTextView
ให้บันทึกสถานะคุณต้องเพิ่มfreezesText
แอตทริบิวต์:
<TextView
...
android:freezesText="true" />
จากเอกสารเกี่ยวกับfreezesText
:
หากตั้งค่าไว้มุมมองข้อความจะรวมข้อความที่สมบูรณ์ในปัจจุบันไว้ในไอติมที่แช่แข็งนอกเหนือจากข้อมูลเมตาเช่นตำแหน่งเคอร์เซอร์ปัจจุบัน โดยค่าเริ่มต้นจะปิดใช้งาน มันจะมีประโยชน์เมื่อเนื้อหาของมุมมองข้อความไม่ได้ถูกเก็บไว้ในที่ถาวรเช่นผู้ให้บริการเนื้อหา
ในการเก็บรักษาข้อมูลเกี่ยวกับการเปลี่ยนแปลงการวางแนวคุณต้องใช้สองวิธี:
@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);
}
1) ไม่ใช่ทุกมุมมองที่มี ID จะบันทึกสถานะ วิดเจ็ต Android ที่มี ID ซึ่งผู้ใช้สามารถเปลี่ยนสถานะได้ดูเหมือนจะบันทึกสถานะของพวกเขาในการฆ่าแบบนุ่มนวล ดังนั้น EditText จะบันทึกสถานะ แต่ TextView จะไม่บันทึกสถานะของมันในการฆ่าแบบนุ่มนวล
"AFAIK, Android จะรบกวนสถานะการบันทึกสำหรับสิ่งที่คาดว่าจะเปลี่ยนแปลงเท่านั้นนั่นคือเหตุผลว่าทำไมจึงบันทึกข้อความใน EditText (ซึ่งผู้ใช้มีแนวโน้มที่จะเปลี่ยนแปลง) และอาจไม่บันทึกสถานะสำหรับ TextView (ซึ่งโดยปกติจะคงที่ )”
มาร์คม
ดังนั้นคุณสามารถเลือกที่จะบันทึกสถานะของ textview ใน onSaveInstanceState และคุณอาจเลือกที่จะกู้คืนสถานะของ textview ใน onCreate
2) แนวทางปฏิบัติที่ดีที่สุดคือบันทึกสถานะอินสแตนซ์ที่ไม่ใช่มุมมอง "ภายใน" แม้ว่าคุณจะประกาศก็ตาม
android:configChanges= "orientation|keyboardHidden"
จากเอกสาร:
"อย่างไรก็ตามแอปพลิเคชันของคุณควรสามารถปิดระบบและรีสตาร์ทได้ตลอดเวลาโดยที่สถานะก่อนหน้าไม่เสียหายไม่เพียงเพราะมีการเปลี่ยนแปลงการกำหนดค่าอื่น ๆ ที่คุณไม่สามารถป้องกันไม่ให้รีสตาร์ทแอปพลิเคชันของคุณได้ แต่ยังเพื่อจัดการกับเหตุการณ์ต่างๆเช่นเมื่อผู้ใช้ได้รับข้อความเข้า โทรศัพท์แล้วกลับไปที่แอปพลิเคชันของคุณ "
JAL
Android ไม่ได้จัดการเรื่องแบบนั้นให้คุณ คุณได้บันทึกข้อมูลทั้งหมดด้วยตนเอง
คุณสามารถใช้ในกิจกรรมเพื่อบันทึกค่า
@Override
public Object onRetainNonConfigurationInstance() {
HashMap<String, Object> savedValues = new HashMap<String, Object>();
savedValues.put("someKey", someData);
return savedValues;
}
และใช้สิ่งนี้ในวิธีการสร้างกิจกรรมเพื่อโหลดวัตถุที่บันทึกไว้
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>
แก้ไขกิจกรรมของคุณใน AndroidManifest.xml เพื่อลบล้างพฤติกรรมการเปลี่ยนแปลงการวางแนวโดยเพิ่มสิ่งนี้ในกิจกรรม / กิจกรรมของคุณ:
android:configChanges="orientation|keyboardHidden"
ควรมีลักษณะดังนี้:
<activity android:name=".activity.LoginActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
</activity>
เพิ่มสิ่งเหล่านี้ใน AndroidManifest.xml
ใส่ชื่อกิจกรรมของคุณในตำแหน่งของActivity_Name
<activity android:name="Activity_Name"
android:screenOrientation="sensor"
...
android:configChanges="orientation|keyboardHidden|screenSize">
สิ่งนี้จะใช้ได้กับการเปลี่ยนค่า TextField ด้วย
เพียงแค่เพิ่ม
android:configChanges="orientation|screenSize"
ไปยังกิจกรรมของคุณใน AndroidManifest.xml
ฉันยังใช้
android:configChanges="orientation"
และมันไม่ได้ผล
แต่แล้วฉันก็พบวิธีแก้ปัญหา
ตรวจสอบว่าคุณมีบรรทัดต่อไปนี้อย่างถูกต้องหรือไม่:
<uses-sdk android:minSdkVersion="11" android:targetSdkVersion="11" />
ตรวจสอบให้แน่ใจว่าไม่ได้อ่านสิ่งที่ชอบ
<uses-sdk android`:minSdkVersion="11" android:targetSdkVersion="15" />`
ฉันมีวิธีที่สองในตอนแรก แต่เมื่อฉันแก้ไขสถานะได้รับการรักษาไว้