Soru Android: bir parçayı başka biriyle değiştiremez


Bir değiştirmem gerek Fragment birinde Activity diğeriyle birlikte Fragment, aşağıda katman dosyasının Activity:

<?xml version="1.0" encoding="utf-8"?>

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

    <fragment android:name="com.foo.FragA"
        android:id="@+id/home_list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

    </FrameLayout>

yani varsayılan olarak Fragaşimdi onu değiştirmek istiyorum FragB faaliyette, ben yaptım:

public void onRegionClicked(Region region) {
    RegionInfoFragment rif = RegionInfoFragment.newInstance(region);
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.home_list, rif);
}

Ama istisna aldım:

>6:24:40.685: ERROR/AndroidRuntime(9194): Uncaught handler: thread main exiting due to uncaught exception
05-06 16:24:40.692: ERROR/AndroidRuntime(9194): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at android.view.ViewGroup.addViewInner(ViewGroup.java:1857)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at android.view.ViewGroup.addView(ViewGroup.java:1752)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at android.view.ViewGroup.addView(ViewGroup.java:1709)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at android.view.ViewGroup.addView(ViewGroup.java:1689)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:743)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:933)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:578)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1219)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:380)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at android.os.Handler.handleCallback(Handler.java:587)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at android.os.Looper.loop(Looper.java:123)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at android.app.ActivityThread.main(ActivityThread.java:4363)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at java.lang.reflect.Method.invokeNative(Native Method)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at java.lang.reflect.Method.invoke(Method.java:521)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):     at dalvik.system.NativeStart.main(Native Method)

Ne yapabilirim?

Teşekkürler!


44
2018-05-06 06:36


Menşei


Üzgünüm bir hata yaptım, kodda ft.commit () 'ı kaçırmadım ve yukarıdaki istisnayı aldım. - hzxu
Bu video nasıl yapıldığını gösteriyor: bağlantı - user3800924


Cevaplar:


Düzen dosyasında statik olarak tanımlanan bir parçayı değiştiremezsiniz. Dinamik olarak eklediğiniz parçaları yalnızca bir FragmentTransaction.


113
2018-05-06 06:38



Teşekkürler, onları programlı olarak eklemeye çalışacağım. - hzxu
Bunu yapmak için uygun yolu gösteren bir bağlantı sağlayabilir mi? Teşekkürler. - James
@James - Bir göz atın Fragmanı Android Dokümantasyonu. Altındaki kod snippet'ine bakın. "Veya, parçayı varolan bir ViewGroup'a programsal olarak ekleyin." - Peter Ajtai
Dinamik olarak eklenen parçalar neden bir süre üst üste geliyor? - Snehal Poyrekar
Bu yorum doğru yapıldı. Parça oluşturmayı statik xml bildiriminden uzaklaştırın ve eklemek için FragmentTransaction kullanın. Ayrıca, FragmentTransaction kullanarak parçayı değiştirirken, parçayı gerçek parçanın kimliğini geçmek yerine () ile değiştirmeyi ilk param olarak tutan parçayı kullandığınızdan emin olun. @PeterAjtai tarafından sağlanan linkte "Fragman İşlemlerinin Gerçekleştirilmesi" bölümüne bakınız. - Bamerza


Deneyin commit() ft sonunda, yapmanız gereken commit() değişikliklerinizi bildirmek için.


4
2017-12-20 07:24





Bir parçayı diğeriyle değiştirin ve bir önceki durumu arka yığında saklayın:

// Yeni parça ve işlem oluştur

Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

0
2017-11-19 18:59