2013-12-18 27 views
2

我已經看到很多關於在片段中保存佈局方向改變的問題,但無法解決。 我有一個片段活動。在它的XML我只有一個元素: -佈局不保持狀態在Android片段

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

,並在活動中我打電話的片斷: -

 FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     ForgotPassword fragment = new ForgotPassword(); 
     fragmentTransaction.add(R.id.fragment_container, fragment); 
     fragmentTransaction.commit(); 

ForgotPassword片段,我創建兩個按鈕和一個EditText 。現在,點擊其中一個按鈕,我隱藏了另一個按鈕和edittext。

當我旋轉屏幕,重新創建的佈局,我可以看到我所有的部件即使我已經把setRetainInstance(true)

我的部件不維護自己的狀態。如果它們不可見,則屏幕旋轉時應保持不可見狀態

+0

所以,你是否從你的Fragments被調用的地方爲你的Fragment Activity添加了configchanges? – Piyush

+0

我已經添加了configChanges =「screenSize」。不要告訴我添加方向,因爲這不是解決方案。謝謝 –

回答

3

可見性不是在屏幕旋轉過程中保存/恢復的瞬態View狀態的一部分。

保存處理由View.onSaveInstanceState()及其覆蓋。的View.onSaveInstanceState()默認實現如下:

protected Parcelable onSaveInstanceState() { 
    mPrivateFlags |= PFLAG_SAVE_STATE_CALLED; 
    return BaseSavedState.EMPTY_STATE; 
} 

即沒有被默認爲您保存。諸如TextView的視圖將爲save additional state(例如,當前文本,如果setFreezesText被調用,則爲真)。我不知道任何默認的視圖保存可見性狀態。

如果您希望保留可見性狀態,則必須自行保存。以下是一些選項:

  1. 創建所需視圖的子類並覆蓋View.onSaveInstanceState保存對該束的可見性。方法概述here
  2. 覆蓋包含您的視圖的片段中的Fragment.onSaveInstanceState,保存對該包的可見性。
  3. 使用Fragment.setRetainInstance(true),並將片段內的可見性狀態作爲實例變量維護,在再次創建View之後重新應用狀態。警告:如果您的進程在後臺中被殺死,則其他兩個選項都不會保留狀態。
1

工作液

當您使用setRetainInstance(真)

的片段將保留狀態。除此之外,您必須找出一種方法來保留視圖的可見性狀態,並在片段的onViewCreated()方法中重新創建視圖。

這裏需要注意的重要一點是,當您使用保留的可見性設置重新創建視圖時,它不應該在onCreateView()中完成。

在下面的代碼片段中,我使用setRetainInstance(true)保留「rbChecked」變量中的單選按鈕選中的值,然後在方向更改後更改rbChecked值以在onViewCreated()方法中重新創建可見性狀態。

public class CaptureReminderFragment extends Fragment { 

    private String rbChecked; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 

    return inflater.inflate(R.layout.capture_reminder_fragment, container, false); 

} 

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

    setRetainInstance(true); 
} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    ButterKnife.bind(this, view); 
    if(rbChecked != null) { 
     switch (rbChecked) { 
      case "daily": 
       layoutEvents.setVisibility(View.GONE); 
       layoutReminderDay.setVisibility(View.GONE); 
       layoutDate.setVisibility(View.GONE); 
       layoutSpecificReminderName.setVisibility(View.GONE); 
       layoutNakshatra.setVisibility(View.GONE); 
       layoutRashi.setVisibility(View.GONE); 
       break; 
      case "events": 
       layoutEvents.setVisibility(View.VISIBLE); 
       layoutReminderDay.setVisibility(View.VISIBLE); 
       layoutDate.setVisibility(View.GONE); 
       layoutSpecificReminderName.setVisibility(View.GONE); 
       layoutNakshatra.setVisibility(View.GONE); 
       layoutRashi.setVisibility(View.GONE); 
       break; 
      case "specific": 
       layoutSpecificReminderName.setVisibility(View.VISIBLE); 
       layoutEvents.setVisibility(View.GONE); 
       layoutReminderDay.setVisibility(View.GONE); 
       layoutDate.setVisibility(View.VISIBLE); 
       layoutNakshatra.setVisibility(View.GONE); 
       layoutRashi.setVisibility(View.GONE); 
       break; 
      default: 
       layoutEvents.setVisibility(View.GONE); 
       layoutReminderDay.setVisibility(View.GONE); 
       layoutDate.setVisibility(View.GONE); 
       layoutSpecificReminderName.setVisibility(View.GONE); 
       layoutNakshatra.setVisibility(View.GONE); 
       layoutRashi.setVisibility(View.GONE); 
       break; 
     } 
    } 

} 

}