7

Điều đặc biệt về Edittext là nó có thể giữ lại giá trị chứ không phải Textview và một số tiện ích khác và chúng ta phải sử dụng phương thức onSavedInstance() cho chúng.Cách EditText giữ lại giá trị của nó chứ không phải textview khi thay đổi hướng điện thoại?

Phép thuật đằng sau EditText đặc biệt là nó có thể giữ lại các giá trị là gì?

Nếu ai đó có thể biết cách hoạt động bên trong.

< ---- Cập nhật ---->

Làm thế nào nó hoạt động trong nội bộ, hãy trỏ đến một phần của mã này giải thích kịch bản này.

+0

là u có đặt giá trị của TextView thông qua mã không? – Atrix1987

+0

Tôi không hỏi làm thế nào để giữ lại nó nhưng làm thế nào nó được xử lý tự động bởi android? –

+0

thực sự nó sẽ ... hoặc bạn đang cố gắng để nói cái gì khác?/ – Kiran

Trả lời

5

Trích dẫn từ bài viết này: http://tekeye.biz/2012/saving-activity-state

"Switching thiết bị từ dọc sang ngang gây Android để dừng lại và khởi động lại hoạt động, cho phép hoạt động cơ hội để vẽ lại một màn hình cho các kích thước khác nhau Với dừng và bắt đầu một hoạt động. Android có một cặp phương thức được gọi là onSaveInstanceState (Bundle) và onRestoreInstanceState (Bundle) được sử dụng bởi Views một cách tự động để lưu dữ liệu của họ. được xác định, do đó cần có EditText để có id, cặp phương thức này có thể được ghi đè trong một Activity để các biến trạng thái không liên kết với các trường đầu vào cũng có thể được lưu và phục hồi. "

Tháo id từ một EditText và thử nó :)

+0

Textview và edittext cả hai ban đầu là mFreeze là false. Nhưng Edittext duy trì trạng thái. Nhưng Textview không duy trì trạng thái. Điều này xảy ra như thế nào ??? –

8

sự kỳ diệu đằng sau EditText đặc biệt nó có thể giữ lại giá trị là bao nhiêu? Cách thức hoạt động trong nội bộ, Vui lòng trỏ đến phần mã giải thích kịch bản này.

Đây là thuộc tính có thể chọn mang lại sự khác biệt. Điều kiện if sau đây trong TextView.onSaveInstanceState sẽ giải quyết vấn đề.

@Override 
public Parcelable onSaveInstanceState() { 
    Parcelable superState = super.onSaveInstanceState(); 

    // Save state if we are forced to 
    boolean save = mFreezesText; 
    int start = 0; 
    int end = 0; 

    if (mText != null) { 
     start = getSelectionStart(); 
     end = getSelectionEnd(); 
     if (start >= 0 || end >= 0) { 
      // Or save state if there is a selection 
      save = true; 
     } 
    } 

    ... 
} 

Theo mặc định TextView không thể chọn được. Do đó, getSelectionStart()getSelectionEnd() trả về -1, ở đó bởi save biến giữ giá trị sai. Để làm cho nó giữ nguyên nội dung của nó trên thay đổi hướng, hãy đặt thuộc tính textIsSelectable thành true.

Kể từ EditText là lựa chọn theo mặc định, getSelectionStart()getSelectionEnd() luôn trả lại giá trị> = 0, có bằng save biến giữ giá trị thực sự và nội dung được lưu.

Lưu ý: Theo mặc định freezesText bị tắt. Do đó, giá trị mFreezesText là sai.

+0

Bạn có thể giải thích tại sao 'getSelectionStart()' và 'getSelectionEnd()' luôn trả về giá trị> = 0 khi 'textIsSelectable' là đúng? Ý tôi là, nếu văn bản có thể lựa chọn, nhưng không có gì được chọn, không nên cả hai phương thức trả về -1? – curioustechizen

+0

@curioustechizen Nếu không có văn bản nào được chọn, phần bắt đầu và kết thúc lựa chọn sẽ là 0, cho biết rằng không có văn bản nào được chọn.Nó giống như đặt con trỏ ở chỉ mục thứ 0, như trong trường hợp EditText. Đây là [địa điểm] (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.4_r1/android/text/method/ArrowKeyMovementMethod.java?av = f # 302) nơi nó được đặt thành 0. –

+0

Hmm .. điều này là khó hiểu. Mã bạn liên kết với dường như mâu thuẫn với javadocs. Cụ thể, 'TextView # getSelectionStart()' trỏ tới 'android.text.Selection # getSelectionStart()'. Và javadocs cho trạng thái sau: 'Trả về giá trị bù của neo hoặc con trỏ chọn, hoặc -1 nếu không có lựa chọn hoặc con trỏ.' – curioustechizen

3

Theo mặc định, chế độ xem EditText lưu trạng thái của nó - Điều này được thực hiện bằng cách đặt cờ trong mã cho biết chế độ xem lưu trạng thái khi chế độ xem không hiển thị hoặc bị mất tiêu điểm. Văn bản được lưu tự động và khôi phục sau khi xoay thiết bị. Tiết kiệm tự động của tình trạng EditText xem có thể bị vô hiệu hóa trong file layout XML bằng cách thiết lập android: tài sản saveEnabled false:

android:saveEnabled="false" 

Hoặc lập trình, gọi view.setSaveEnabled(false).

lưuĐiều khiển được bật cho dù trạng thái lưu của chế độ xem này có được bật hay không (tức là, liệu phương thức onSaveInstanceState() của nó sẽ được gọi). Lưu ý rằng ngay cả khi đóng băng được bật, chế độ xem vẫn phải có id được gán cho nó (thông qua setId()) cho trạng thái của nó được lưu. Cờ này chỉ có thể vô hiệu hóa việc lưu chế độ xem này; bất kỳ chế độ xem con nào cũng có thể được lưu lại trạng thái của chúng. thuộc tính saveEnabled là một phần của Android View - View Code. phụ tùng ở đây là liên quan đến mã:

public boolean isSaveEnabled() { 
     return (mViewFlags & SAVE_DISABLED_MASK) != SAVE_DISABLED; 
    } 

...

public void setSaveEnabled(boolean enabled) { 
     setFlags(enabled ? 0 : SAVE_DISABLED, SAVE_DISABLED_MASK); 
    } 

...

void setFlags(int flags, int mask) { 
     int old = mViewFlags; 
     mViewFlags = (mViewFlags & ~mask) | (flags & mask); 

     int changed = mViewFlags^old; 
     if (changed == 0) { 
      return; 
     } 
     int privateFlags = mPrivateFlags; 

     /* Check if the FOCUSABLE bit has changed */ 
     if (((changed & FOCUSABLE_MASK) != 0) && 
       ((privateFlags & HAS_BOUNDS) !=0)) { 
      if (((old & FOCUSABLE_MASK) == FOCUSABLE) 
        && ((privateFlags & FOCUSED) != 0)) { 
       /* Give up focus if we are no longer focusable */ 
       clearFocus(); 
      } else if (((old & FOCUSABLE_MASK) == NOT_FOCUSABLE) 
        && ((privateFlags & FOCUSED) == 0)) { 
       /* 
       * Tell the view system that we are now available to take focus 
       * if no one else already has it. 
       */ 
       if (mParent != null) mParent.focusableViewAvailable(this); 
      } 
     } 

....

1

Hãy thử điều này cho TextView của bạn tôi nghĩ rằng nó có thể giúp bạn

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

Android Xem lớp đã được bảo vệ phương pháp

protected Parcelable onSaveInstanceState() 
protected void onRestoreInstanceState (Parcelable state) 

vì vậy bất kỳ xem có thể ghi đè lên các phương pháp đó và lưu thông tin trạng thái Xem lý lịch thành với họ.

TextView mở rộng Chế độ xem lớp và có triển khai bảo vệ Parcelable onSaveInstanceState() và được bảo vệ void onRestoreInstanceState (trạng thái Parcelable) bên trong nó.

cho phép xem xét việc thực hiện các onSaveInstanceState()

@Override 
public Parcelable onSaveInstanceState() 
{ 
    Parcelable superState = super.onSaveInstanceState(); 

    // Save state if we are forced to 
    boolean save = mFreezesText; 
    int start = 0; 
    int end = 0; 

    if (mText != null) 
    { 
     start = getSelectionStart(); 
     end = getSelectionEnd(); 
     if (start >= 0 || end >= 0) 
     { 
      // Or save state if there is a selection 
      save = true; 
     } 
    } 
    ... 
} 
  1. như bạn có thể thấy ở đây tiết kiệm năng là tùy thuộc vào lá cờ đơn "tiết kiệm" vì vậy nếu người dùng chỉ định rõ ràng mFreezesText = true sau đó nó sẽ tiết kiệm văn bản
  2. một khả năng khác nếu có con trỏ chọn thì ít nhất nó sẽ trả về getSelectionStart() = 0 và không -1 sẽ khiến TextView thực hiện lưu = true để lưu trạng thái của TextView và đó là những gì xảy ra với EditText như EditText lựa chọn curs hoặc và nó mở rộng TextView.
Các vấn đề liên quan