有關EditText Array in Android 問題

本帖最後由 是但 於 2015-8-27 15:46 編輯

我有個好簡單的SharedPreferences code,都係啲 Save, Load, Clear 咁,
想將啲EditText 放係一個Array度,好像以下CODE咁,
但有個問題:
如將my_ets放係(B)度係OK無問題,但放係(A)度就
"void android.widget.EditText.setText(java.lang.CharSequence)' on a null object reference"

請問應如何解決?
  1. EditText et_nameA, et_nameB, et_nameC, et_nameD, et_nameE;
  2. EditText[] my_ets = { et_nameA, et_nameB, et_nameC, et_nameD, et_nameE };<--(A)
  3. String[] listvalue = { "nameA", "nameB", "nameC", "nameD", "nameE" };
  4.         protected void onCreate(Bundle savedInstanceState) {
  5.         sp_file = getSharedPreferences("profile", 0);
  6. ....
  7. }
  8.         private void LoadData() {
  9.                 EditText[] my_ets = { et_nameA, et_nameB, et_nameC, et_nameD, et_nameE };<--(B)
  10.                 for (int i = 0; i < my_ets.length; i++) {
  11.                         my_ets[i].setText(sp_file.getString(listvalue[i], ""));
  12.                 }
  13.         }
複製代碼

本帖最後由 hihihi123hk 於 2015-8-27 16:58 編輯
我有個好簡單的SharedPreferences code,都係啲 Save, Load, Clear 咁,
想將啲EditText 放係一個Array度,好 ...
是但 發表於 2015-8-27 15:25



先解譯下:

放係A 嘅話,你個 View 未開始 render  你已經儲低左個 Reference ,所以會出 null

放係 B 就係 每次 你 Call 呢個 function 先拎個Reference ( 好明顯係 你 call 呢個 function 嘅時候,個 View 己經 render 好)

方法:

你可以係 onCreate 入面先至拎哂出黎
  1. public class AppActivity extend Activity {
  2.     private EditText[] ets;

  3.     public void onCreate(...) {
  4.        ets = {findViewById( id1 ), findViewById( id2 ),findViewById( id3 )};
  5.     }

  6.     private void loadData(){};

  7. }
複製代碼
好耐無寫 android , syntax 可能有啲唔岩  不過概念大約係咁

TOP

本帖最後由 Charcoal99 於 2015-8-27 16:26 編輯

跟你的 setContentView(), findViewById(), LoadData() 先後順序時機相關,
你都要表列出來才能知道。

估計是(A) 創建my_ets[] 時, et_nameA 等 variables 還未bind 到具體的EditText物件, 所以仍是null,
但在(B) LoadData()時, 估計 setContentView(), findViewById() 已經完成, 所以在(B)裡面為非null 可用。

樓上師兄正解

TOP

我之前都估可能啲view 問題,現在改都咁就WORK
  1. EditText[] my_ets = new EditText[5];
  2. ....
  3. my_ets[0] = (EditText) findViewById(R.id.A);
  4.                 my_ets[1] = (EditText) findViewById(R.id.B);
  5.                 my_ets[2] = (EditText) findViewById(R.id.C);
  6.                 my_ets[3] = (EditText) findViewById(R.id.D);
  7.                 my_ets[4] = (EditText) findViewById(R.id.E);
複製代碼
不過我覺唔係咁好maintain,因為我會唔記得my_ets 係乜東東,請問有無啲好方去呢?

TOP

咁咪易跟 d囉.
  1. int my_id = {R.id.A, R.id.B, R.id.C, R.id.D, R.id.E};
  2. EditText[] my_ets = new EditText[my_id.length];
  3. ....

  4. for (int x=0; x<my_id.length; x++){
  5.                my_ets[x] = (EditText) findViewById(my_id[x]);
  6. }
複製代碼

TOP

回覆 5# IanW

我又學到野, THX

TOP