2017-04-25 3 views
0

Ich versuche, die Positionen der beiden Fragmente durch Klicken auf die Schaltfläche zu vertauschen. Zuerst füge ich FrameLayout in meine XML-Datei ein.java.lang.IllegalStateException: Container-ID des Fragments kann nicht geändert werden

<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" /> 

Und dann die Fragmente hinzufügen, wenn 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(); 

Aber das kleine Fragment wurde nicht gezeigt worden! Ich habe versucht, Position zwei Fragmente zu tauschen, aber die Kleinen scheinen immer noch nicht. Und wenn ich versuche, ihre Position zu ändern, indem Sie auf eine Schaltfläche klicken sie angezeigt werden:

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) 

Hier ist mein Code, wenn klicken:

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(); 

Es scheint

+0

Fügen manager.executePendingTransactions() zu tun, bevor das Fragment zum zweiten Mal hinzugefügt wird. – Isuru

+0

Es funktioniert nicht für mich Wenn Sie MapFragment oder CameraPreviewFragment zum big_fragment hinzufügen, werden alle angezeigt, aber wenn add in content_frame_small nicht alle erscheinen –

Antwort

0

@Sarah Huang

Hier in Ihrem Code, dass Sie keine Transaktion ausführen, deshalb wird Ihr kleines Fragment nicht angezeigt.

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

Sie versuchen, diese

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

Ich habe den Commit-Code unterhalb des Add-Codes ausgeführt. ft.commitAllowingStateLoss(); –

+0

Ich denke, für jede Fragmenttransaktion müssen Sie commit() aufrufen – vaibhav

Verwandte Themen