android - getChildFragmentManager() प्रोग्रामेटिक रूप से(गतिशील रूप से) जोड़ा गया टुकड़े?




android-fragments android-nested-fragment (2)

प्रोग्राम (या गतिशील रूप से) जोड़ा गया Fragment एस पर कैसे उपयोग करें (या "हम उपयोग कर सकते हैं") getChildFragmentManager() ?

मेरा उदाहरण यहाँ है।

मेरे पास एक MainActivity , एक OuterFrag , और एक InnerFrag । मैं FragmentManager द्वारा गतिशील रूप से MainActivity OuterFrag में MainActivity OuterFrag जोड़ OuterFrag । और, मैं InnerFrag OuterFrag द्वारा गतिशील रूप से OuterFrag में OuterFrag भी OuterFrag । लेकिन मैं InnerFrag बच्चे के रूप में InnerFrag को जोड़ना चाहता OuterFrag , OuterFrag को प्रतिस्थापित नहीं OuterFrag और OuterFrag का नया बच्चा MainActivity

मैं इस पदानुक्रम को रखना चाहता हूं: MainActivity -> OuterFrag -> InnerFrag तो मुख्य गतिविधि हमेशा ऑउटरफ्रैग को कॉल कर सकती है।

लेकिन इस पदानुक्रम से नहीं बदला: MainActivity -> OuterFrag इस पदानुक्रम के लिए MainActivity -> InnerFrag : MainActivity -> InnerFrag कि MainActivity को नुकसान OuterFrag

मेरा उदाहरण कोड यहाँ है।

MainActivity.java

package com.example.frag;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getSupportFragmentManager().beginTransaction().add(R.id.frameLayout, new OuterFrag()).commit();
        getSupportFragmentManager().executePendingTransactions();

        System.out.println("Before: "
                + getSupportFragmentManager().findFragmentById(R.id.frameLayout));

        ((OuterFrag) getSupportFragmentManager().findFragmentById(R.id.frameLayout))
                .addInnerFrag();

        System.out.println("After: "
                + getSupportFragmentManager().findFragmentById(R.id.frameLayout));
    }
}

activity_main.xml

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

OuterFrag.java

package com.example.frag;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class OuterFrag extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.outer_frag, container, false);
    }

    public void addInnerFrag() {

        getFragmentManager().beginTransaction().replace(this.getId(), new InnerFrag()).commit();
        getFragmentManager().executePendingTransactions();

//        getChildFragmentManager().beginTransaction().add(this.getId(), new InnerFrag()).commit();
//        getChildFragmentManager().executePendingTransactions();
    }
}

outer_frag.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="i am the OUTER frag" />

InnerFrag.java

package com.example.frag;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class InnerFrag extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.inner_frag, container, false);
    }
}

inner_frag.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="i am the INNER frag" />

वर्तमान में, उपर्युक्त कोड त्रुटियों के बिना चला सकता है। लेकिन यह वास्तव में InnerFrag के नए बच्चे के रूप में InnerFrag को बदल रहा है। यह दो सिस्टम प्रिंट आउट कथन द्वारा सत्यापित किया जा सकता है कि पहले: ऑब्जेक्ट और बाद: ऑब्जेक्ट बदल गया है। OuterFrag.java , अगर getFragmentManager() स्टेटमेंट getFragmentManager() कथन के बजाए चलाए जाते हैं, तो हमें निम्न रनटाइम त्रुटि मिल जाएगी:

12-07 02:29:38.406: E/AndroidRuntime(12051): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.frag/com.example.frag.MainActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f070000 (com.example.frag:id/frameLayout) for fragment InnerFrag{46e32748 #0 id=0x7f070000}

getChildFragmentManager() का उपयोग सैद्धांतिक रूप से सही है। इसका उपयोग गैर-प्रोग्रामेटिक रूप से जोड़े गए खंड में किया जा सकता है (जिसका अर्थ है <FrameLayout> <fragment> बदलना, विशेषता जोड़ें android:name="com.example.frag.OuterFrag" , और पहले getSupportFragmentManager() MainActivity.java में MainActivity.java )। और यह सही पदानुक्रम रख रहा है: MainActivity -> OuterFrag -> InnerFrag । लेकिन मूल खंड ( outer_frag.xml ) के शब्दों को कभी नहीं हटाया जा सकता है।

अंत में, मैं हमेशा OuterFrag में MainActivity का संदर्भ OuterFrag चाहता हूं। और मैं चाहता हूं कि OuterFrag InnerFrag एस लोड करने के लिए InnerFrag प्लेसहोल्डर के रूप में कार्य करे। संक्षेप में, मैं OuterFrag में getChildFragmentManager() को कॉल करना चाहता OuterFrag , जब इसे प्रोग्रामेटिक रूप से (गतिशील रूप से) जोड़ा जाता है।


अंत में, मैं हमेशा मेनएक्टिविटी में ऑउटरफ्रैग का संदर्भ देना चाहता हूं। और मैं अलग-अलग इनरफ्रैग लोड करने के लिए ऑउटरफ्रैग प्लेसहोल्डर के रूप में कार्य करना चाहता हूं। संक्षेप में, मैं OuterFrag में getChildFragmentManager () को कॉल करना चाहता हूं, जब इसे प्रोग्रामेटिक रूप से (गतिशील रूप से) जोड़ा जाता है।

यदि आप इसे चाहते हैं तो अपने OuterFrag को अपनी सामग्री के रूप में एक कंटेनर लेआउट InnerFrag और उस कंटेनर में जो भी InnerFrag जोड़ें। OuterFrag लिए लेआउट फ़ाइल होगी:

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

बेशक आप OuterFrag लिए लेआउट में अन्य विचार देख सकते हैं यदि आप चाहते हैं। फिर आपकी addInnerFrag विधि होगी:

public void addInnerFrag() {
        getChildFragmentManager().beginTransaction().add(R.id.fragContainer, new InnerFrag()).commit();
        getChildFragmentManager().executePendingTransactions();
}

मुख्य गतिविधि में OuterFrag जोड़ने के लिए कोड मान्य रहता है।


यदि आप अपने OuterFrag.java कोड में addInnerFrag() को कॉल करना चाहते हैं, तो आप इसे इस तरह से कर सकते हैं:

OuterFrag.java:

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    addInnerFrag();
}




android-nested-fragment