2012-11-24 74 views
2

我有一個簡單的佈局,其中包含兩個片段。兩個片段中的一個會週期性地取代它,另一個片段在我使用它的整個時間內將保持一致。出於某種原因,刪除/添加它工作得很好,但替換它會導致其他片段消失。我從調試代碼知道,片段只是被分離,沒有明顯的原因。爲什麼會這樣呢?如果我使用後者,我必須非常小心地確保QuestionArea先走了......消失片段(Dettached without request)

這些代碼行來自FragmentActivity類。

 fragManager.beginTransaction() 
     .replace(R.id.QuestionArea, getQuestionPostView(), "QuestionArea") 
     .commit(); 

     fragManager.beginTransaction() 
     .remove(fragManager.findFragmentById(R.id.QuestionArea)) 
     .add(R.id.QuestionArea, getQuestionPostView(), "QuestionArea") 
     .commit(); 

這是我希望的是其他相關代碼:

主顯示器的XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:orientation="vertical" > 

    <com.pearsonartphoto.FontFitTextView 
     android:id="@+id/Name" 
     style="@style/bigText" 
     android:background="@color/blue" 
     android:gravity="center" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true"/> 

    <TextView android:id="@+id/Instructions" 
     style="@style/medText" 
     android:layout_width="fill_parent" 
     android:layout_below="@id/PowerName" 
     /> 

    <fragment 
     android:name="com.pearsonartphoto.NumberDisplay" 
     android:gravity="center" 
     android:id="@+id/QuestionArea" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/Instructions"/> 

    <fragment 
     android:name="com.pearsonartphoto.AbstractAnswerFragment" 
     android:id="@+id/AnswerArea" 
     style="@style/bigText" 
     android:gravity="center" 
     android:layout_below="@+id/QuestionArea" 
     android:layout_alignParentBottom="true" 
     android:layout_width="fill_parent" 
     android:layout_height="530sp"/> 

</RelativeLayout> 

FragmentActivity的一部分,該樹立AnswerArea

​​

第一次(來自FragmentActivity)設置了QuestionArea。

fragManager.beginTransaction() 
    .replace(R.id.QuestionArea, getQuestionPreView(), "QuestionArea") 
    .commit(); 

功能getPostView()和getPreView()

@Override 
Fragment getQuestionPreView() { 
    NumberDisplay display=(NumberDisplay)manager.findFragmentById(R.id.QuestionArea); 
    display.setNumber(-1); 
    return display; 
} 

@Override 
Fragment getQuestionPostView() { 
    NumberDisplay display=(NumberDisplay)manager.findFragmentById(R.id.QuestionArea); 
    display.setNumber(answer); 
    return display; 
} 

回答

2

你的問題,最有可能的,因爲試圖在運行時改變靜態片段(片段在XML佈局聲明),你不該不行。如果您打算替換,刪除FragmentActivity中的那些片段,則應在其xml佈局中放置包裝器佈局(如FrameLayout),並將該容器用於將來片段事務。查詢this來自Android工程師的答案。

+1

這提供了我需要算出這個信息的關鍵位。謝謝!我打算爲未來的用戶發佈更詳細的版本,但是,如果沒有您的幫助,我不能拿出這個版本。 – PearsonArtPhoto

+0

我剛剛給你一個讚美。這一舉克服了我一直面臨的很多問題。非常感謝! – PearsonArtPhoto

1

存在需要工作要做,以使這項工作的幾件事情:

  1. 最關鍵的事情是改變我的主要XML代碼FrameLayout
  2. 我不得不創建一些較小的片段,因爲我之前不需要創建它們。

新主要XML代碼:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:orientation="vertical" > 

    <com.pearsonartphoto.FontFitTextView 
     android:id="@+id/PowerName" 
     style="@style/bigText" 
     android:background="@color/blue" 
     android:gravity="center" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true"/> 

    <TextView android:id="@+id/Instructions" 
     style="@style/medText" 
     android:layout_width="fill_parent" 
     android:layout_below="@id/PowerName" 
     /> 

    <FrameLayout 
     android:gravity="center" 
     android:id="@+id/QuestionArea" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/Instructions"/> 

    <FrameLayout 
     android:id="@+id/AnswerArea" 
     style="@style/bigText" 
     android:gravity="center" 
     android:layout_below="@+id/QuestionArea" 
     android:layout_alignParentBottom="true" 
     android:layout_width="fill_parent" 
     android:layout_height="530sp"/> 

</RelativeLayout>