सवाल एंड्रॉइड: एक टुकड़े को दूसरे के साथ बदल नहीं सकता है


मुझे एक को बदलने की जरूरत है Fragment एक में Activity दूसरे के साथ Fragment, नीचे की परत फ़ाइल है 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>

तो डिफ़ॉल्ट रूप से वहाँ है फ़्रागा, अब मैं इसे बदलना चाहता हूं FragB गतिविधि में, मैंने किया:

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

लेकिन मुझे अपवाद मिला:

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

मैं क्या कर सकता हूँ?

धन्यवाद!


44
2018-05-06 06:36


मूल


क्षमा करें मैंने गलती की, मुझे कोड में ft.commit () याद नहीं आया, और उपरोक्त अपवाद मिला। - hzxu
यह वीडियो दिखाता है कि यह कैसे किया गया: संपर्क - user3800924


जवाब:


आप लेआउट फ़ाइल में स्थिर रूप से परिभाषित एक खंड को प्रतिस्थापित नहीं कर सकते हैं। आप केवल उन टुकड़ों को प्रतिस्थापित कर सकते हैं जिन्हें आपने गतिशील रूप से जोड़ा है FragmentTransaction


113
2018-05-06 06:38



धन्यवाद, मैं उन्हें प्रोग्रामेटिक रूप से जोड़ने की कोशिश करूंगा। - hzxu
क्या कोई ऐसा करने का उचित तरीका दिखा रहे एक लिंक प्रदान कर सकता है? धन्यवाद। - James
@ जेम्स - पर एक नज़र डालें टुकड़ा एंड्रॉइड दस्तावेज़ीकरण। कोड स्निपेट को नीचे देखें, "या, प्रोग्रामेटिक रूप से मौजूदा व्यू ग्रुप में खंड जोड़ें।" - Peter Ajtai
गतिशील रूप से जोड़े गए टुकड़े कुछ समय क्यों ओवरलैप करते हैं ?? - Snehal Poyrekar
यह टिप्पणी सच रही। स्थिर एक्सएमएल घोषणा से खंड निर्माण को दूर करें और इसे जोड़ने के लिए FragmentTransaction का उपयोग करें। इसके अलावा, जब FragmentTransaction का उपयोग करके टुकड़े को प्रतिस्थापित करना वास्तविक टुकड़े की आईडी में गुजरने के बजाय () को प्रतिस्थापित करने के लिए पहले पैरा के रूप में टुकड़े को धारण करने वाले कंटेनर का उपयोग करना सुनिश्चित करें। @PeterAjtai द्वारा प्रदान किए गए लिंक में "फ्रैगमेंट लेनदेन निष्पादित करें" अनुभाग देखें - Bamerza


की कोशिश commit() फीट के अंत में, आपको इसकी आवश्यकता है commit() इसे बदलने के लिए आपके परिवर्तन।


4
2017-12-20 07:24





एक टुकड़े को दूसरे के साथ बदलें, और पिछली स्थिति को पीछे की स्थिति में सुरक्षित रखें:

// नया टुकड़ा और लेनदेन बनाएँ

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