2011-08-20 68 views
1

我試圖在一個活動中保存我的視圖狀態,並使用一個Bundle將它傳遞給另一個活動。在第二個活動中,我嘗試使用該包來恢復視圖狀態。如何恢復Android視圖(UI)的狀態?

第一活動

private View CreateView() { 
ScrollView scrollView = new ScrollView(this); 
final LinearLayout layout = new LinearLayout(this); 
layout.setOrientation(android.widget.LinearLayout.VERTICAL); 
scrollView.addView(layout);   
Button btn = new Button(this); 
btn.setId(100); 
btn.setText("Button Text"); 
btn.setOnClickListener(new ClickListener()); 
layout.addView(btn); 
return scrollView; 
} 

的onCreate

super.onCreate(savedInstanceState); 
View v = CreateView(); 
setContentView(v); 

中保存狀態

SparseArray<Parcelable> array = new SparseArray<Parcelable>(); 
view.saveHierarchyState(array); 
Bundle bundle = new Bundle(); 
bundle.putSparseParcelableArray("state", array); 
Intent intent = new Intent(context, SecondActivity.class); 
intent.putExtras(bundle); 
startActivity(intent); 

第二個活動的onCreate

bundle = this.getIntent().getExtras();   
View view = new View(this); 
view.restoreHierarchyState(bundle.getSparseParcelableArray("state")); 
setContentView(view.getRootView()); 
Button btn = (Button)findViewById(100); 

一切正常,沒有例外。但是,我面臨兩個問題: 1.第二項活動中的視圖爲空白。儘管我已恢復保存的狀態,但看不到任何東西 2.第二個活動中按鈕(帶有ID爲100)的實例始終爲空

在調試過程中,我可以看到包中有一個值編號100

任何幫助,我似乎做錯了將不勝感激。謝謝

+1

這讓我覺得很奇怪,想要做。什麼是推理? – Dave

+0

@Dave - 同意這是一件很奇怪的事情。遺憾的是我不能在這裏討論「爲什麼」的一部分!謝謝! –

回答

2

我發現無法在最初創建(或渲染)的其他活動中恢復視圖。由於View不是可序列化的類型,因此它也不能完整地發送。在這一點上似乎沒有任何解決方案(我還沒有探討修改Android源代碼的選項)

0

你試過在onSavedInstanceState(...)這麼做嗎?

Android文檔:

的onSaveInstanceState(包)放置活動 這樣的背景狀態,讓您在任何動態 實例的狀態在您的活動保存消失在給定的包被調用之前,至遲在 的onCreate(捆綁)

+0

當活動即將從堆棧中取出時,onSaveInstanceState由Android調用。但是,我試圖根據應用程序觸發器將狀態從一個視圖傳遞到另一個視圖。謝謝。 –

+0

爲什麼不使用[Intent](http://developer.android.com/reference/android/content/Intent.html)? – Phil

+0

如果你看到我的源代碼,我使用意圖 –

1

爲什麼你想創建一個查看編程並將其發送到另一個ACTIV收到性?您可以簡單地在兩個活動中使用相同的佈局,然後只傳遞支持該視圖的數據。那也會有比使用可以分類的更方便的方法嗎?

你能詳細說明你在這裏想達到什麼嗎?也許我們可以給你一個更好的反應,然後......

0

我採取的唯一方法是使用onSaveInstanceState和onRestoreInstanceState。

public void onSaveInstanceState(Bundle outState){ 
    //save the state of the sign up views! 
    Serializable page0fields = sign_in_page.getFields(); 
    outState.putSerializable("page0fields", page0fields); 
    super.onSaveInstanceState(outState);  
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState){ 
    //restore the state of the sign up views! 
    sign_in_page.fillFields(
      savedInstanceState.getSerializable("page0fields") 
      ); 
    super.onRestoreInstanceState(savedInstanceState); 
} 

在另一方面,你似乎渴望一個更加自動化的方法來此。我不相信你可以任意傳遞意見,因爲它們不是可序列化的,儘管我可能弄錯了。

+0

是的,視圖是不可序列化的。這就是爲什麼我使用View.saveHierarchyState的原因,它返回一個Bundle,而這個Bundle又是可序列化的 –