我已經寫了很長一段時間的android應用程序,但現在我面臨着一個我從未想過的問題。這與關於配置更改的Activitys
和Fragments
有關的android生命週期。爲此,我有這個必要的代碼創建一個小的應用程序:Activity和Fragment中的自動UI配置更改處理有時會失敗
public class MainActivity extends FragmentActivity {
private final String TAG = "TestFragment";
private TestFragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fm = getSupportFragmentManager();
fragment = (TestFragment) fm.findFragmentByTag(TAG);
if (fragment == null) {
fragment = new TestFragment();
fm.beginTransaction().add(R.id.fragment_container, fragment, TAG).commit();
}
}
}
這裏是我的TestFragment
代碼。請注意,我在onCreate
方法中調用setRetainInstance(true);
,以便在配置更改後不會記錄片段。
public class TestFragment extends Fragment implements View.OnClickListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater li, ViewGroup parent, Bundle bundle) {
View rootView = li.inflate(R.layout.fragment_test, parent, false);
Button button = (Button) rootView.findViewById(R.id.toggleButton);
button.setOnClickListener(this);
return rootView;
}
@Override
public void onClick(View v) {
Button button = (Button) v;
String enable = getString(R.string.enable);
if(button.getText().toString().equals(enable)) {
button.setText(getString(R.string.disable));
} else {
button.setText(enable);
}
}
}
這裏是我的片段使用佈局:
<LinearLayout
...>
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/toggleButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/enable"/>
</LinearLayout>
我的問題是,如果我旋轉設備的Button
變化的文本返回到默認值。當然,Fragment
的View
是新建立的並且膨脹了,但是應該恢復視圖的保存實例。我的佈局中還有一個EditText
,文本和其他屬性在旋轉後保留。那麼爲什麼按鈕默認不從Bundle
恢復?我已經閱讀了developer site:
默認情況下,系統採用Bundle實例的狀態保存有關每個視圖對象的信息在你的活動佈局(如進入一個EditText對象的文本值)。因此,如果您的活動實例被銷燬並重新創建,那麼佈局的狀態將恢復到之前的狀態,並且不需要您的代碼。
我也讀了很多答案的最後幾天,但我不知道他們是如何實際了。請不要留下評論或回答,android:configChanges=...
這是很差的做法。我希望有人能夠讓我對缺乏理解感到輕鬆。
但是正如我所說默認視圖應該自動保存並恢復其屬性 – Cilenco
@Cilenco我認爲你的假設在這裏是錯誤的 - 像TextView和Buttons默認情況下'freezesText' false - 可能出於性能原因 - 這些組件通常被讀取-只要。諸如EditText或ScrollViews之類的東西確實可以保存並恢復它們的狀態 - 因爲預計用戶會操縱它們。 –
當你給一個'TextView'(Button是它的一個子類)時,一個layoutId狀態將在默認情況下被恢復(查看[這裏](http://stackoverflow.com/a/6097177/2047987) )在我的情況下,按鈕有一個ID,所以它應該恢復其狀態。 – Cilenco