पुनः लोड पर फ्रैगमेंट को ताज़ा करें


110

एक Android आवेदन में मैं एक डीबी से एक TableViewअंदर एक में डेटा लोड कर रहा हूँ Fragment। लेकिन जब मैं Fragmentइसे पुनः लोड करता हूं तो यह पिछले डेटा को प्रदर्शित करता है। क्या मैं Fragmentपिछले डेटा के बजाय वर्तमान डेटा के साथ फिर से खोल सकता हूं ?


कृपया हमें कुछ कोड दिखाएं। आप अपना डेटा कहां लोड करते हैं, आप अपना टुकड़ा कहां से शुरू करते हैं, आप अपने मूल्यों को कहां स्टोर करते हैं?
के रूप में

यह आपकी छिद्रित वर्णित समस्या को हल करना चाहिए: stackoverflow.com/questions/6503189/…
बेंजामिन डब्ल्यू

कृपया अधिक जानकारी-कोड स्निपेट प्रदान करें
nikvs

अपने ऐप में स्वाइप-टू-रिफ्रेश का उपयोग करने का प्रयास करें इस stackoverflow.com/questions/41469040/fragment-refresh/…
Imtiaz Mamun

जवाबों:


207

मुझे लगता है कि आप डीबी अपडेट पर टुकड़े सामग्री को ताज़ा करना चाहते हैं

यदि ऐसा है, तो टुकड़े को अलग करें और इसे फिर से डालें

// Reload current fragment
Fragment frg = null;
frg = getSupportFragmentManager().findFragmentByTag("Your_Fragment_TAG");
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.detach(frg);
ft.attach(frg);
ft.commit();

Your_Fragment_TAG वह नाम है जिसे आपने बनाते समय अपना टुकड़ा दिया था

यह कोड सपोर्ट लाइब्रेरी के लिए है।

आप पुराने उपकरणों का समर्थन नहीं कर रहे हैं, बस का उपयोग getFragmentManager बजाय getSupportFragmentManager

[संपादित करें]

इस विधि में टैग होने के लिए फ़्रैगमेंट की आवश्यकता होती है।
यदि आपके पास यह नहीं है, तो @ हैमर की विधि वह है जो आपको चाहिए।


3
यह निम्नलिखित त्रुटि देता है - java.lang.RuntimeException: परिणाम देने में विफलता ResultInfo {who = null, request = 2, result = 3, data = null} को गतिविधि {xont.virtusel.v4 .controller / xont.virtusel.v4.controller के लिए .sale.InvocieBrandActivity}: java.lang.IllegalStateException: onSaveInstanceState
Samantha Withanage


1
@Rotwang आपके उत्तर के लिए धन्यवाद, मैंने लंबे कोड के बजाय सिर्फ एक शॉर्टकट लिया, लेकिन इससे मार्ग प्रशस्त हुआ :)
Si8

1
यह समाधान समर्थन-v4-लाइब्रेरी (25.1.0) के नए संस्करण में और काम नहीं कर रहा है। यहाँ स्पष्टीकरण: stackoverflow.com/questions/41270858/…
ब्राह्मण बुआबौद

1
चेतावनी: यह ट्रिक Oreo पर तभी काम करती है जब आप Support Fragments का उपयोग कर रहे हों!
दौड़

146

यह वर्तमान टुकड़े को ताज़ा करेगा:

FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
   ft.setReorderingAllowed(false);
}
ft.detach(this).attach(this).commit();

1
इस कोड को कहाँ रखा जाए? अंदर गतिविधि या टुकड़ा ही?
नरेन्द्र सिंह

2
आप इसे उस टुकड़े के अंदर डालते हैं जिसे ताज़ा करने की आवश्यकता होती है।
Mbengue Assane

1
@ सागरचवड़ा आपने कोड कहां रखा था? आपको इसे एक बार की घटना में डालना होगा जैसे डेटा ताज़ा किया जाता है।
Mbengue Assane

5
पुनरावर्तन, पुनरावृत्ति, अंतहीन कॉल
zulkarnain shah

2
इस का उपयोग कर बनाता है भीतर onResume टुकड़ा में एक पाश बनाता है, यह कैसे से बचने के लिए?
सोल

32

यदि आपके पास विखंडन टैग नहीं है, तो निम्न कोड मेरे लिए अच्छा काम करता है।

Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
if (currentFragment instanceof "NAME OF YOUR FRAGMENT CLASS") {
 FragmentTransaction fragTransaction =   (getActivity()).getFragmentManager().beginTransaction();
 fragTransaction.detach(currentFragment);
 fragTransaction.attach(currentFragment);
 fragTransaction.commit();}
}

1
टुकड़ा आईडी क्या होगा, मैंने खंड आईडी को कहीं भी घोषित नहीं किया है। इसे कैसे और कहां घोषित किया जाए?
नरेंद्र सिंह

getActivity()मेरी गतिविधि में उपयोग नहीं किया जा सकता । क्या मुझे उपयोग करना चाहिए Activity.this...?
228 बजे Si8

@NarendraJi यह केवल फ्रेम-आउट आईडी है, जहाँ आप अपने अंश कंटेनर में रखते हैं।
लोकेश

कृपया उस अतिरिक्त ब्रेस को हटा दें। इससे मुझे बहुत परेशानी हुई।
अभिषेक

9

जब आप उपयोगकर्ता को दिखाई देते हैं, तो आप अपने टुकड़े को ताज़ा कर सकते हैं, बस इस कोड को अपने फ़्रैगमेंट में जोड़ें यह आपके टुकड़े को तब दिखाई देगा जब यह दिखाई देगा।

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // Refresh your fragment here          
  getFragmentManager().beginTransaction().detach(this).attach(this).commit();
        Log.i("IsRefresh", "Yes");
    }
}

इतनी धीमी गति से पुन: लोड होने तक 3 सेकंड लगते हैं
उमर बोश्रा

यह viewpager अनुकूलक के साथ अच्छी तरह से काम करता है
DragonFire

2
setUserVanishHint को पदावनत किया जाता है
साईं आदित्य

मेरे लिए काम किया, समाधान के लिए धन्यवाद।
हत्सगांधी

7

खंडित किए गए उत्तर को रीफ्रेश करने के लिए नौगट और इसके बाद के संस्करण पर काम नहीं करेगा। इसे सभी ओएस पर काम करने के लिए आप निम्नलिखित कर सकते हैं।

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        fragmentManager.beginTransaction().detach(this).commitNow();
        fragmentManager.beginTransaction().attach(this).commitNow();
    } else {
        fragmentManager.beginTransaction().detach(this).attach(this).commit();
    }

5

जब आप गतिविधि से जुड़े होते हैं, तो आप उस खंड को पुनः लोड नहीं कर सकते, जहाँ आपको Fragment Already Addedअपवाद मिलता है।

इसलिए टुकड़े को पहले अपनी गतिविधि से अलग करना होगा और फिर संलग्न होना होगा। सभी धाराप्रवाह एपीआई का उपयोग एक पंक्ति में किया जा सकता है:

getFragmentManager().beginTransaction().detach(this).attach(this).commit();

अद्यतन: यह एपीआई 26 और इसके बाद के संस्करण में किए गए परिवर्तनों को शामिल करना है:

FragmentTransaction transaction = mActivity.getFragmentManager()
                        .beginTransaction();
                if (Build.VERSION.SDK_INT >= 26) {
                    transaction.setReorderingAllowed(false);
                }
                transaction.detach(this).attach
                        (this).commit();

अपडेट के अधिक विवरण के लिए कृपया https://stackoverflow.com/a/51327440/4514796 देखें


2
कृपया स्पष्ट विवरण के साथ अपना उत्तर दें। कोड न लिखें, आपके द्वारा साझा किए गए कोड के बारे में स्पष्टीकरण दें, ताकि अन्य भी समझ सकें और यह मददगार होगा। मैं आपसे अनुरोध करता हूं कि एक प्रभावी तरीके से स्टैक ओवरफ्लो का उपयोग करने के लिए पूछे जाने वाले प्रश्न अनुभाग को पढ़ें।
संकर गणेश

3
   MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
        getSupportFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit();

यह केवल तभी काम करेगा जब यू FragmentManagerटुकड़े को इनिशियलाइज़ करने के लिए उपयोग करेगा । अगर <fragment ... />एक्सएमएल में यह यू के रूप में है, तो यह onCreateViewफिर से कॉल नहीं करेगा । यह पता लगाने के लिए मेरे 30 मिनट बर्बाद कर दिए।


1

यहाँ मैंने क्या किया और इसने मेरे लिए काम किया मैं फायरबेस का उपयोग करता हूं और जब उपयोगकर्ता लॉग इन होता है तो मैं वर्तमान फ़्रैगमेंट को ताज़ा करना चाहता था, आपको गतिविधि से संदर्भ की आवश्यकता होगी क्योंकि खंड के पास संदर्भ प्राप्त करने का एक तरीका नहीं है जब तक आप इसे गतिविधि या संदर्भ से निर्धारित नहीं करते हैं। कोड जिसका मैंने उपयोग किया है और कोटलिन भाषा में काम किया है, मुझे लगता है कि आप जावा क्लास में भी इसका उपयोग कर सकते हैं

   override fun setUserVisibleHint(isVisibleToUser: Boolean) {
    super.setUserVisibleHint(isVisibleToUser)
    val context = requireActivity()
    if (auth.currentUser != null) {
        if (isVisibleToUser){
            context.supportFragmentManager.beginTransaction().detach(this).attach(this).commit()
        }
    }

}

0

ContentProvider'CursorLoader' का उपयोग करके आप डेटा का उपयोग करें और लोड करें । इस आर्किटेक्चर के साथ आपका डेटा डेटाबेस परिवर्तनों पर स्वचालित रूप से पुनः लोड किया जाएगा। अपने लिए तीसरे पक्ष के ढांचे का उपयोग करें ContentProvider- आप वास्तव में इसे खुद से लागू नहीं करना चाहते हैं ...


0

मेरे पास एक ही मुद्दा था लेकिन उपरोक्त में से कोई भी मेरे लिए काम नहीं करता था। या तो बैकस्टैक समस्या थी (लोड करने के बाद जब उपयोगकर्ता ने वापस दबाया तो उसे फिर से उसी टुकड़े पर जाना होगा) या उसने कॉल नहीं कियाonCreaetView

आखिरकार मैंने ऐसा किया:

public void transactFragment(Fragment fragment, boolean reload) {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    if (reload) {
        getSupportFragmentManager().popBackStack();
    }
    transaction.replace(R.id.main_activity_frame_layout, fragment);
    transaction.addToBackStack(null);
    transaction.commit();
}

अच्छी बात यह है कि आपको टुकड़े के टैग या आईडी की आवश्यकता नहीं है। यदि आप पुनः लोड करना चाहते हैं


0

OnResume मेथड का इस्तेमाल करें ... फ्रैगमेंट एक्टिविटी और फ्रैगमेंट को होल्ड करने वाली एक्टिविटी दोनों पर।


0
getActivity().getSupportFragmentManager().beginTransaction().replace(GeneralInfo.this.getId(), new GeneralInfo()).commit();

GeneralInfo यह मेरा टुकड़ा वर्ग है GeneralInfo.java

मैंने इसे खंड वर्ग में एक विधि के रूप में रखा:

public void Reload(){
    getActivity().getSupportFragmentManager().beginTransaction().replace(LogActivity.this.getId(), new LogActivity()).commit();
}

0

TabLayout के साथ उदाहरण के लिए: बस OnTabSelectedListener लागू करें। पृष्ठ को फिर से लोड करने के लिए, आप लागू कर सकते हैं SwipeRefreshLayout.OnRefreshListener अर्थातpublic class YourFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {

onRefresh () विधि इंटरफ़ेस से @ ऑवरराइड होगी अर्थात:

@Override
public void onRefresh() {
 loadData();
}

यहाँ लेआउट है:

<com.google.android.material.tabs.TabLayout
    android:id="@+id/tablayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimaryLighter"
    app:tabGravity="fill"
    app:tabIndicatorColor="@color/white"
    app:tabMode="fixed"
    app:tabSelectedTextColor="@color/colorTextPrimary"
    app:tabTextColor="@color/colorTextDisable" />

अपनी गतिविधि में कोड

TabLayout tabLayout = (TabLayout) findViewById (R.id.tablayout); tabLayout.setupWithViewPager (viewPager);

    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            if (tab.getPosition() == 0) {
                yourFragment1.onRefresh();
            } else if (tab.getPosition() == 1) {
                yourFragment2.onRefresh();
            }
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

-2
protected void onResume() {
        super.onResume();
        viewPagerAdapter.notifyDataSetChanged();
    }

ViewpagerAdapter.notifyDataSetChanged () लिखें; मेनअक्टिविटी में onResume () पर। शुभ लाभ :)


-2

सबसे आसान उपाय

एक सार्वजनिक स्थैतिक विधि बनाएं जिसमें viewpager.setAdapter शामिल हो

एडेप्टर और व्यूपैगर को स्थिर बनाएं

public static void refreshFragments(){
        viewPager.setAdapter(adapter);
    }

कहीं भी कॉल करें, किसी भी गतिविधि, किसी भी टुकड़े।

MainActivity.refreshFragments();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.