2017-04-25 91 views
0

我嘗試通過單擊按鈕來交換兩個分段的位置。 首先,我在我的xml文件中添加了兩個FrameLayout。java.lang.IllegalStateException:無法更改分段的容器ID

<FrameLayout 
    android:id="@+id/content_frame_small" 
    android:layout_width="120dp" 
    android:layout_height="200dp" 
    android:layout_marginTop="50dp" 
    android:layout_alignParentRight="true" 
    android:clickable="true" 
    android:rotation="90" /> 

<FrameLayout 
    android:id="@+id/big_fragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

然後添加片段時initView

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    findViewById(R.id.content_frame_small).bringToFront(); 
    if (mapFragment == null) { 
     mapFragment = new MapFragment(); 
    } 
    ft.addToBackStack(MapFragment.TAG); 
    ft.add(R.id.content_frame_small, mapFragment, MapFragment.TAG); 
    if (cameraPreviewFragment == null) { 
     cameraPreviewFragment = new CameraPreviewFragment(); 
    } 
    ft.addToBackStack(CameraPreviewFragment.TAG); 
    ft.add(R.id.big_fragment, cameraPreviewFragment, CameraPreviewFragment.TAG); 
    ft.commitAllowingStateLoss(); 

但是小片段並沒有被證明!我試圖交換兩個片段的位置,但小的還沒有出現。當我試圖改變自己的位置通過點擊一個按鈕,它出現:

java.lang.IllegalStateException: Can't change container ID of fragment MapFragment{43138b40 #0 id=0x7f110098 MapFragment}: was 2131820696 now 2131820697 
                      at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:406) 
                      at android.support.v4.app.BackStackRecord.add(BackStackRecord.java:375) 
                      at com.locision.ogipssampler.activity.CameraRecordActivity.onClick(CameraRecordActivity.java:321) 
                      at android.view.View.performClick(View.java:4444) 
                      at android.view.View$PerformClick.run(View.java:18457) 
                      at android.os.Handler.handleCallback(Handler.java:733) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:136) 
                      at android.app.ActivityThread.main(ActivityThread.java:5049) 
                      at java.lang.reflect.Method.invokeNative(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:515) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609) 
                      at dalvik.system.NativeStart.main(Native Method) 

這裏是我的代碼,當點擊:

isShowMap = !isShowMap; 
FragmentTransaction ft = 
getSupportFragmentManager().beginTransaction(); 
if (mapFragment.isAdded()) { 
    ft.remove(mapFragment); 
    } 
if (cameraPreviewFragment.isAdded()) { 
    ft.remove(cameraPreviewFragment); 
} 
ft.commitAllowingStateLoss(); 

getSupportFragmentManager().executePendingTransactions(); 
ft = getSupportFragmentManager().beginTransaction(); 
if (isShowMap) { 
    mapFragment.showLogo(); 
    ft.add(R.id.big_fragment, mapFragment, MapFragment.TAG); 
    ft.add(R.id.content_frame_small, cameraPreviewFragment, 
    CameraPreviewFragment.TAG); 
    } else { 
     mapFragment.disapperLogo(); 
     ft.add(R.id.big_fragment, cameraPreviewFragment, CameraPreviewFragment.TAG); 
     ft.add(R.id.content_frame_small, mapFragment, MapFragment.TAG); 
     cameraPreviewFragment.loadView(cameraManager) 
    } 
    ft.commitAllowingStateLoss(); 

看來

+0

包括manager.executePendingTransactions()。 – Isuru

+0

它不適用於我當將MapFragment或CameraPreviewFragment添加到big_fragment時,所有這些都顯示出來,但是當添加content_frame_small時,它們都沒有出現 –

回答

0

@Sarah黃

在你的代碼中,你沒有提交交易,這就是爲什麼你的小型 片段沒有顯示。

ft.addToBackStack(MapFragment.TAG); 
ft.add(R.id.content_frame_small, mapFragment, MapFragment.TAG); 

您嘗試添加片段第二次之前做到這一點

ft.addToBackStack(MapFragment.TAG); 
    ft.add(R.id.content_frame_small, mapFragment, MapFragment.TAG).commit(); 
+0

我在添加代碼下執行了提交代碼。 ft.commitAllowingStateLoss(); –

+0

我認爲對於每個片段事務你必須調用commit() – vaibhav

相關問題