गतिविधि समूह के अंदर एक और टुकड़े के साथ एक टुकड़े की जगह


137

मेरे पास एक समूह गतिविधि के अंदर एक टुकड़ा है और मैं इसे एक और टुकड़े के साथ बदलना चाहता हूं:

FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
SectionDescriptionFragment bdf = new SectionDescriptionFragment();
ft.replace(R.id.book_description_fragment, bdf);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();

यह ठीक काम करता है जब यह गतिविधि समूह का उपयोग किए बिना एक अलग परियोजना के रूप में किया जाता है, तो हर चीज लॉग कैट में ठीक काम करती है क्योंकि नियंत्रण गेटव्यू () के अंदर चला जाता है, लेकिन कोई दृश्य दिखाई नहीं देता है, कोई अपवाद भी नहीं उठता है, मैं पुस्तक विवरण टुकड़ा करना चाहता हूं खंड विस्तार खंड द्वारा प्रतिस्थापित किया जाएगा।

पुस्तक विवरण खंड के Xml में id book_description_fragment है और खंड विवरण के लिए xml में id खंड_description_fragment है।

उपरोक्त कोड एक आइटम के ऑनक्लिक विधि में है, मैं चाहता हूं कि जब उपयोगकर्ता क्षैतिज स्क्रॉल दृश्य में किसी आइटम पर टैप करता है, तो सुगंधित परिवर्तन होता है।

जवाबों:


250

XML में हार्ड कोडित फ़्रैगमेंट को प्रतिस्थापित नहीं किया जा सकता है। यदि आपको एक टुकड़े को दूसरे के साथ बदलने की आवश्यकता है, तो आपको उन्हें गतिशील रूप से जोड़ना चाहिए, सबसे पहले।

नोट: R.id.fragment_container उस गतिविधि में आपकी पसंद का एक लेआउट या कंटेनर है जिसे आप टुकड़ा ला रहे हैं।

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

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

// Commit the transaction
transaction.commit();

8
इस मामले में R.id.fragment_container क्या है?
गाइ

4
@ जीयू, यह कोई भी लेआउट हो सकता है जिसे आप टुकड़े को लोड करना चाहते हैं।
सुबिन सेबेस्टियन

1
xml फ़ाइल में टुकड़े का नाम क्या होना चाहिए? मैं गतिशील रूप से टुकड़ा जोड़ना चाहता हूं और कोई स्थिर टुकड़ा नहीं चाहता।
रजत मेहरा

1
@RajatMehra यदि आप टुकड़ों को गतिशील रूप से जोड़ना चाहते हैं, तो आपको XML के अंदर के टुकड़े को बिल्कुल भी निर्दिष्ट करने की आवश्यकता नहीं है। आप कंटेनर दृश्य का उपयोग कर सकते हैं। कृपया जवाब फिर से पढ़ें।
सबिन सेबेस्टियन 3

4
@ कारण यह है कि, आर्किटेक्चर द्वारा, सिस्टम प्रत्येक <खंड> टैग को इसी खंड द्वारा दिए गए दृश्य (समूह) के साथ बदल देता है onCreateView()। इस प्रकार, जैसा कि आप मान सकते हैं, खंड का कोई भी संदर्भ वास्तव में दृश्य स्तर पर खो जाता है। इसलिए, आप मूल रूप से एक टुकड़े को प्रतिस्थापित नहीं कर सकते हैं, बल्कि आप मैन्युअल रूप से कंटेनर में मौजूद विचारों को हटा सकते हैं और यदि आवश्यक हो तो इसके बजाय एक टुकड़ा डाल सकते हैं।
सुबीन सेबेस्टियन

35

कृपया इस प्रश्न को देखें

आप केवल " गतिशील रूप से जोड़ा गया टुकड़ा " बदल सकते हैं ।

इसलिए, यदि आप एक गतिशील टुकड़ा जोड़ना चाहते हैं, तो इस उदाहरण को देखें ।


1
नमस्ते । मैंने इसका हल खोज लिया है, वास्तव में मैं टुकड़े की सामग्री को एक लेआउट में नहीं रख रहा था, बल्कि मैं पिछले टुकड़े की सामग्री के लिए एक और टुकड़े का उपयोग कर रहा था
शेर दिल

नहीं, यहाँ मैं पूरे टुकड़े को एक नए टुकड़े के साथ बदलना चाह रहा था।
सना

1
@ लायन हार्ट, क्या आप कृपया पाए गए समाधान को विस्तृत कर सकते हैं?
नम्रता

लिंक मर चुका है: /
नियॉन वेज

8

मैं टुकड़ा प्रतिस्थापन और जीवन चक्र का प्रबंधन करने के लिए सही विधि के साथ एक जिस्ट बनाया है ।

यह केवल वर्तमान टुकड़े को एक नए से बदल देता है, अगर यह समान नहीं है और यदि यह बैकस्ट में नहीं है (इस मामले में यह इसे पॉप करेगा)।

इसमें कई विकल्प होते हैं जैसे कि आप चाहते हैं कि टुकड़े को बैकस्ट में सहेजा जाए।

=> यहां देखें जिस्ट

यह और एक गतिविधि का उपयोग करके, आप इसे अपनी गतिविधि में जोड़ना चाह सकते हैं:

@Override
public void onBackPressed() {
    int fragments = getSupportFragmentManager().getBackStackEntryCount();
    if (fragments == 1) {
            finish();
            return;
    }

    super.onBackPressed();
}

1
@ RémiP लिंक उम्मीद के मुताबिक काम कर रहा है। आप बेहतर IMO github.com/HugoGresse/Anecdote/blob/master/app/src/main/java/io/……
Hugo Gresse

8

Android.support.v4 में नीचे दिए गए कोड का उपयोग करें

FragmentTransaction ft1 = getFragmentManager().beginTransaction();
WebViewFragment w1 = new WebViewFragment();
w1.init(linkData.getLink());
ft1.addToBackStack(linkData.getName());
ft1.replace(R.id.listFragment, w1);
ft1.commit();

4

V4 का उपयोग करके इस कोड का उपयोग करें

 ExampleFragment newFragment = new ExampleFragment();     
 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();  
 // Replace whatever is in the fragment_container view with this fragment,  
 // and add the transaction to the back stack so the user can navigate back   
 transaction.replace(R.id.container, newFragment);
 transaction.addToBackStack(null);  
 // Commit the transaction   
 transaction.commit();

3

आशा है कि आप अच्छा कर रहे हैं। जब मैंने काम शुरू किया Android Fragmentsथा, तब मुझे भी यही समस्या हो रही थी, तब मैंने लगभग 1- दूसरे के साथ टुकड़ा कैसे स्विच किया जाए, पढ़ा। 2- अगर Fragment containerकोई टुकड़ा न हो तो टुकड़ा कैसे जोड़े ।

फिर कुछ आर एंड डी के बाद, मैंने एक फ़ंक्शन बनाया जो मुझे अब तक कई परियोजनाओं में मदद करता है और मैं अभी भी इस सरल फ़ंक्शन का उपयोग कर रहा हूं।

public void switchFragment(BaseFragment baseFragment) {
    try {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
        if (getSupportFragmentManager().findFragmentById(R.id.home_frame) == null) {
            ft.add(R.id.home_frame, baseFragment);
        } else {
            ft.replace(R.id.home_frame, baseFragment);
        }
        ft.addToBackStack(null);
        ft.commit();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

अपने कोड समय का आनंद लें :)


3

ViewPager का उपयोग करें। यह मेरे लिए काम है।

final ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.vp_pager); 
button = (Button)result.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        viewPager.setCurrentItem(1);
    }
});

1

आप इस कोड का उपयोग कर सकते हैं

((AppCompatActivity) getActivity()).getSupportFragmentManager().beginTransaction().replace(R.id.YourFrameLayout, new YourFragment()).commit();

या आप इस कोड का उपयोग कर सकते हैं

YourFragment fragments=(YourFragment) getSupportFragmentManager().findFragmentById(R.id.FrameLayout);

        if (fragments==null) {
            getSupportFragmentManager().beginTransaction().replace(R.id.FrameLayout, new Fragment_News()).commit();
        }

0

कोटलिन में आप कर सकते हैं:

// instantiate the new fragment
val fragment: Fragment = ExampleFragment()

val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.book_description_fragment, fragment)
transaction.addToBackStack("transaction_name")
// Commit the transaction
transaction.commit()

0

आप लेन-देन के लिए सरल कोड का उपयोग कर सकते हैं

Fragment newFragment = new MainCategoryFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame_NavButtom, newFragment);
ft.commit(); 

0

मैं एकल लाइन कोड में गतिशील रूप से टुकड़ा बदलता हूं
यह किसी भी एसडीके संस्करण में काम करता है और एंड्रॉइड
I के रूप में नेविगेशन का उपयोग करता हैBottomNavigationView

    BottomNavigationView btn_nav;
    FragmentFirst fragmentFirst;
    FragmentSecond fragmentSecond;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        fragmentFirst = new FragmentFirst();
        fragmentSecond = new FragmentSecond ();
        changeFragment(fragmentFirst); // at first time load the fragmentFirst
        btn_nav = findViewById(R.id.bottomNav);
        btn_nav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                switch(menuItem.getItemId()){
                    case R.id.menu_first_frag:
                        changeFragment(fragmentFirst); // change fragmentFirst
                        break;
                    case R.id.menu_second_frag:
                        changeFragment(fragmentSecond); // change fragmentSecond
                        break;
                        default:
                            Toast.makeText(SearchActivity.this, "Click on wrong bottom SORRY!", Toast.LENGTH_SHORT).show();
                }
                return true;
            }
        });
    }
public void changeFragment(Fragment fragment) {
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_layout_changer, fragment).commit();
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.