2014-01-16 34 views
0

我創造一些EditTexts與按鈕的onSaveInstanceState打電話,我創建了實現OnClickListener一類,我想屏幕旋轉後,那些EditTexts保存,但他們總是消失。我知道,在旋轉Android的 - 從另一個類比主

  1. 活動被破壞並重新創建

  2. 我不能保存的EditText捆綁,因爲它沒有實現Parcelable或類似的東西

於是,我就至少挽救他們的ID和文本他們有他們與onSaveInstanceState(Bundle savedInstanceState) ,但它不叫,因爲它不是在主類,但在另一個叫ViewControl。我需要保存一些私有變量(text和id),這就是爲什麼我在這個類中有這個方法的原因。我試圖從另一個onSaveInstance中調用這個方法,這個方法在main但是沒有運氣。你能告訴我一些簡單的方法來編程創建一個在另一個下面的EditTexts,並保持它們在屏幕旋轉後?我真的無法找到任何簡單的方法...

主要類

public class MainActivity extends Activity { 

private ViewControl vc; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    vc = new ViewControl(this); 


} 


@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    vc.onSaveInstanceState(savedInstanceState); 

} 

ViewControl類

import java.util.ArrayList; 



public class ViewControl extends Activity implements View.OnClickListener{ 

    private Button btn; 
    private RelativeLayout rl; 
    private Activity act; 
    private ArrayList<Integer> id; 
    private ArrayList<String> userpath; 
    private int lastId; 

    public ViewControl(Activity activity) { 

     this.act = activity; 

     this.id = new ArrayList<Integer>(); 
     this.userpath = new ArrayList<String>(); 

     this.rl = (RelativeLayout)act.findViewById(R.id.layout); 
     this.btn = (Button)act.findViewById(R.id.btn); 

     this.id.add(Integer.valueOf(R.id.btn)); 
     this.btn.setOnClickListener(this); 

    } 


    @Override 
    public void onClick(View v) { 

     if(id.size() != 1) 
      lastId = id.get(id.size() - 1); 
     else 
      lastId = R.id.btn; 

     RelativeLayout.LayoutParams par = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
     par.addRule(RelativeLayout.BELOW, lastId); 

     EditText et = new EditText(act); 

     et.setId(++lastId); 
     id.add(Integer.valueOf(lastId)); 
     et.setText(Integer.toString(lastId)); 

     rl.addView(et, par); 
     lastId = et.getId(); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle savedInstanceState) { 
     super.onSaveInstanceState(savedInstanceState); 
     savedInstanceState.putIntegerArrayList("ids", id); 
     savedInstanceState.putStringArrayList("userpaths", userpath); 
     savedInstanceState.putInt("lastId", lastId); 

     Toast.makeText(act, "Onsave", Toast.LENGTH_LONG).show(); 

    } 

    @Override 
    public void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 

     this.id = savedInstanceState.getIntegerArrayList("ids"); 
     this.userpath = savedInstanceState.getStringArrayList("userpaths"); 
     this.lastId = savedInstanceState.getInt("lastId"); 

     Toast.makeText(act, "Onrestore", Toast.LENGTH_LONG).show(); 

     for(int i = 0; i < id.size(); i++) 
     { 
      RelativeLayout.LayoutParams par = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
      par.addRule(RelativeLayout.BELOW, lastId); 
      EditText et = new EditText(act); 
      et.setId(this.id.get(i)); 
     } 

    } 

} 

回答

0

電話是在錯誤的順序(無論是在MainActivityViewControl)。首先,您應該添加數據,然後將Bundle傳遞給super以保存它(請參閱文檔here)。 (你的onRestoreInstanceState是好的)

+0

在主類我有onSaveInstace ...我不叫任何超級,只是vievcontrol.onSave ...然後在ViewControls onSave我調用超值後,雖然asigning值,但它不起作用 – user3086577

+0

@ user3086577是的,至少在上面的代碼中,檢查MainActivity.onSaveInstanceState。 –

+0

對不起,我的意思是我編輯代碼在PC上,因爲你說,它沒有工作,但後來我意識到它的確,但它不創建EditTexts,但它確實保存值。所以現在我需要弄清楚如何做到這一點。你有沒有什麼好的建議來重新創建以編程方式創建的視圖? – user3086577