वर्तमान खंड वस्तु प्राप्त करें


175

मेरे में main.xmlमैं है

  <FrameLayout
        android:id="@+id/frameTitle"
        android:padding="5dp"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:background="@drawable/title_bg">
            <fragment
              android:name="com.fragment.TitleFragment"
              android:id="@+id/fragmentTag"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content" />

  </FrameLayout>

और मैं इस तरह से टुकड़ा वस्तु सेट कर रहा हूँ

FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new FragmentType1();
fragmentTransaction.replace(R.id.frameTitle, casinodetailFragment, "fragmentTag");

// fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

यह अलग- FragmentType2,FragmentType3,...अलग समय पर विभिन्न प्रकार के फ्रैगमेंट ऑब्जेक्ट्स ( ) सेट कर रहा है । अब किसी समय मुझे यह पहचानने की आवश्यकता है कि वर्तमान में कौन सी वस्तु है।

में कम मैं इस तरह से कुछ करने की जरूरत है:

Fragment currentFragment = //what is the way to get current fragment object in FrameLayout R.id.frameTitle

मैंने निम्नलिखित की कोशिश की

TitleFragment titleFragmentById = (TitleFragment) fragmentManager.findFragmentById(R.id.frameTitle);

तथा

    TitleFragment titleFragmentByTag = (TitleFragment) fragmentManager.findFragmentByTag("fragmentTag");

लेकिन दोनों ऑब्जेक्ट्स (titleFragmentById और titleFragmentByTag)null
क्या मुझे कुछ याद है?
मैं उपयोग कर रहा हूं Compatibility Package, r3और विकसित कर रहा हूं API level 7

findFragmentById()और findFragmentByTag()अगर हम टुकड़ा का उपयोग कर सेट किया है fragmentTransaction.replaceया काम करेंगे fragmentTransaction.add, लेकिन return nullअगर हम xml पर वस्तु निर्धारित किया है (जैसे कि मैंने अपने में क्या किया है main.xml)। मुझे लगता है कि मुझे अपनी XML फ़ाइलों में कुछ याद आ रहा है।


सम्बंधित - stackoverflow.com/a/21104084/80428
Jay Wick

क्या @CommonsWare उत्तर आपकी मदद करता है, क्योंकि मैं अभी भी अशक्त हूं?
8

जवाबों:


253

अब किसी समय मुझे यह पहचानने की आवश्यकता है कि वर्तमान में कौन सी वस्तु है

कॉल findFragmentById()करें FragmentManagerऔर निर्धारित करें कि आपके R.id.frameTitleकंटेनर में कौन सा टुकड़ा है ।


1
आपके प्रतिक्रिया के लिए धन्येवाद। यह काम करेगा यदि हमने fragmentTransaction.replacई का उपयोग करके टुकड़ा सेट किया है या fragmentTransaction.addनहीं मिलेगा, लेकिन अगर हमने इसे xml पर सेट किया है। मेरा संपादन 2 देखें
लबीब पानमपुलन

9
@ लाबीब पी: आप लेआउट संसाधनों में घोषित अंशों को संशोधित नहीं कर सकते।
कॉमन्सवेयर

वर्तमान में दिखाई देने वाले टैब / टुकड़े को धारण करने के लिए एक वर्ग बनाना भी काम करेगा, मैंने ऐसा करने की कोशिश की। आशा है कि कोई असफलता नहीं होगी।
स्काईनेट

@CommonsWare टैब्स के findFragmentByTagमामले में अशक्त लौटते हुए ActionBar। मेरे Activityजो में विस्तार कर रहा ActionBarActivityहूँ, मैं पहले टैब को जोड़ रहा हूँ ActionBarऔर फिर इसे खोज रहा हूँ!
मुहम्मद बाबर

1
@MuhammadBabar: आप कोशिश कर सकते हैं executePendingTransactions()पर FragmentManagerबुला के बाद commit()लेन-देन पर है, हालांकि मैं इस प्रयास नहीं किया है। या आप setContentView()एक <fragment>टैग के साथ एक लेआउट फ़ाइल का उपयोग करने के लिए उपयोग कर सकते हैं । या तो उन तुल्यकालिक रूप से होते हैं, और इसलिए टुकड़ा onCreate()कॉल के भीतर मौजूद होगा जहां आपने उपयोग किया था executePendingTransaction()या setContentView()। अन्यथा, एक साधारण FragmentTransactionको अतुल्यकालिक रूप से संसाधित किया जाता है, और यह समय onCreate()समाप्त होने तक भी शुरू नहीं हुआ होगा ।
कॉमन्सवेयर

110

इसे इस्तेमाल करे,

Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);

यह आपको वर्तमान टुकड़ा देगा, तो आप इसे खंड वर्ग से तुलना कर सकते हैं और अपना सामान कर सकते हैं।

    if (currentFragment instanceof NameOfYourFragmentClass) {
     Log.v(TAG, "find the current fragment");
  }

यह लाइन कहां लगाई जाए?
आनंद सजनानी

9
कभी-कभी आपको getSupportFragmentManager()इसके बजाय उपयोग करना होगा, और supportभाग के बिना अशक्त हो जाएगा
माज़

"अपना नाम कक्षा का नाम" चारों ओर से उद्धरण निकालें।
एलन नेल्सन

37

मुझे लगता है कि आप onAttachFragment घटना का उपयोग करने के लिए उपयोगी हो सकते हैं जो कि टुकड़ा सक्रिय है।

@Override
public void onAttachFragment(Fragment fragment) {
    // TODO Auto-generated method stub
    super.onAttachFragment(fragment);

    Toast.makeText(getApplicationContext(), String.valueOf(fragment.getId()), Toast.LENGTH_SHORT).show();

}

3
मैं कौन सा टुकड़ा संलग्न करने में सक्षम हूं। मेरा विचार यह है कि जब मैं अभिविन्यास को बदलता हूं तब मुझे उसी दृश्य को प्रदर्शित करने की आवश्यकता होती है न कि किसी अन्य दृश्य को ऐसा करने के लिए।
एंड्रोई डेवलपर 14

7
जब आप वापस जाते हैं तो यह सक्रिय टुकड़े को अपडेट नहीं करता है क्योंकि यह काम नहीं करता है।
जस्टिन

1
@Justin तो हम सिर्फ एक WeakReference सूची के साथ भी onDetach उपयोग करने की आवश्यकता
letroll

12

मुझे लगता है कि आपको करना चाहिए:

Fragment currentFragment = fragmentManager.findFragmentByTag("fragmentTag");

इसका कारण यह है कि आपने "फ़्रेग्मेंटैग" टैग को आपके द्वारा जोड़े गए अंतिम टुकड़े (जब आप प्रतिस्थापित करते हैं) में सेट किया है।


धन्यवाद मैंने इसे सही किया है। यह प्रश्न लिखते समय इसकी एक टाइपो गलती। यह काम करेगा यदि हमने fragmentTransaction.replacई का उपयोग करके टुकड़ा सेट किया है या fragmentTransaction.addनहीं मिलेगा, लेकिन अगर हमने इसे xml पर सेट किया है। मेरा संपादन 2 देखें
लबीब पानमपुलन

आपको बहुत - बहुत धन्यवाद! मेरा मुद्दा हल किया!
जोनास ग्रोगर

2
क्या इस समाधान का मतलब यह नहीं है कि आपको कई टुकड़ों के लिए एक ही टैग लगाना होगा? अन्यथा आपको कैसे पता चलेगा fragmentTagकि वर्तमान खंड के लिए टैग है?
बृहस्पति

12

आप टुकड़ों की सूची प्राप्त कर सकते हैं और अंतिम एक को देख सकते हैं।

    FragmentManager fm = getSupportFragmentManager();
    List<Fragment> fragments = fm.getFragments();
    Fragment lastFragment = fragments.get(fragments.size() - 1);

लेकिन कभी-कभी (जब आप वापस नेविगेट करते हैं) सूची का आकार समान रहता है लेकिन कुछ अंतिम तत्व शून्य होते हैं। तो सूची में मैं पिछले नहीं खंडित करने के लिए iterated और इसका इस्तेमाल किया।

    FragmentManager fm = getSupportFragmentManager();
    if (fm != null) {
        List<Fragment> fragments = fm.getFragments();
        if (fragments != null) {
            for(int i = fragments.size() - 1; i >= 0; i--){
                Fragment fragment = fragments.get(i);
                if(fragment != null) {
                    // found the current fragment

                    // if you want to check for specific fragment class
                    if(fragment instanceof YourFragmentClass) {
                        // do something
                    }
                    break;
                }
            }
        }
    }

3
getFragments()विधि का उपयोग न करें । इसके साथ चिह्नित है @hideऔर समर्थन पुस्तकालय जार के साथ शामिल नहीं होना चाहिए था। इसे निर्यातित एपीआई के हिस्से के रूप में नहीं माना जाना चाहिए।
जेम्स वॉल्ड

हेह, तो उन्हें एक ऐसी विधि बनानी चाहिए थी जो आपको ठीक वही करने देती getFragments()है, क्योंकि आपको इसकी अक्सर आवश्यकता होती है। मुझे लगता है कि यह वास्तव में सार्वजनिक रूप से अब भी उपलब्ध है।
इपिकपांडाफार्स

10

यह मेरे लिए सबसे सरल उपाय और काम है।

1.) आप अपने टुकड़े जोड़ते हैं

ft.replace(R.id.container_layout, fragment_name, "fragment_tag").commit();

2.)

FragmentManager fragmentManager = getSupportFragmentManager();

Fragment currentFragment = fragmentManager.findFragmentById(R.id.container_layout);

if(currentFragment.getTag().equals("fragment_tag"))

{

 //Do something

}

else

{

//Do something

}

9

यह देर हो सकती है लेकिन मुझे आशा है कि यह किसी और की मदद करता है, @CommonsWare ने भी सही उत्तर पोस्ट किया है।

FragmentManager fm = getSupportFragmentManager();
Fragment fragment_byID = fm.findFragmentById(R.id.fragment_id);
//OR
Fragment fragment_byTag = fm.findFragmentByTag("fragment_tag");

9
यह आपको सक्रिय टुकड़ा प्राप्त करने की अनुमति नहीं देता है, क्योंकि आपको आवश्यक रूप से आईडी या टैग नहीं पता है।
जस्टिन

7

शायद सबसे आसान तरीका है:

public MyFragment getVisibleFragment(){
    FragmentManager fragmentManager = MainActivity.this.getSupportFragmentManager();
    List<Fragment> fragments = fragmentManager.getFragments();
    for(Fragment fragment : fragments){
        if(fragment != null && fragment.getUserVisibleHint())
            return (MyFragment)fragment;
    }
    return null;
}

इसने मेरे लिए काम किया


6

आप अपने मूल गतिविधि वर्ग में फ़ील्ड बना सकते हैं:

public class MainActivity extends AppCompatActivity {

    public Fragment fr;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

}

और फिर प्रत्येक खंड वर्ग के अंदर:

public class SomeFragment extends Fragment {

@Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        ((MainActivity) getActivity()).fr = this;
}

आपका 'fr' फ़ील्ड वर्तमान खंड ऑब्जेक्ट है

यह popBackStack के साथ भी काम कर रहा है ()


4

मुझे पता है कि यह एक समय हो गया है, लेकिन मैं यहाँ इस मामले में यह किसी को बाहर मदद करता है।

सही जवाब अब तक (और एक चयनित) CommonsWare से एक। मुझे पोस्ट के रूप में एक ही समस्या हो रही थी, निम्नलिखित

MyFragmentClass fragmentList = 
            (MyFragmentClass) getSupportFragmentManager().findFragmentById(R.id.fragementID);

अशक्त लौटते रहे। मेरी गलती वास्तव में मूर्ख थी, मेरी xml फ़ाइल में:

<fragment
    android:tag="@+id/fragementID"
    android:name="com.sf.lidgit_android.content.MyFragmentClass"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>

गलती यह थी कि मेरे पास एंड्रॉइड था : टैग INSTEAD ऑफ एंड्रॉइड: आईडी


2

@ हैमर प्रतिक्रिया ने मेरे लिए काम किया, एक फ्लोटिंग एक्शन बटन को नियंत्रित करने के लिए im

final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View view) {
            android.app.Fragment currentFragment = getFragmentManager().findFragmentById(R.id.content_frame);
            Log.d("VIE",String.valueOf(currentFragment));
            if (currentFragment instanceof PerfilFragment) {
                PerfilEdit(view, fab);
            }
        }
});


1

यदि आप गतिविधि के XML लेयूर में खंड को परिभाषित कर रहे हैं, Activityतो सुनिश्चित करें कि आप कॉल करने setContentView()से पहले कॉल करें findFragmentById()


1

यदि आप बैकस्टैक का उपयोग कर रहे हैं ... और केवल यदि आप बैक स्टैक का उपयोग कर रहे हैं, तो यह प्रयास करें:

rivate Fragment returnToPreviousFragment() {

    FragmentManager fm = getSupportFragmentManager();

    Fragment topFrag = null;

    int idx = fm.getBackStackEntryCount();
    if (idx > 1) {
        BackStackEntry entry = fm.getBackStackEntryAt(idx - 2);
        topFrag = fm.findFragmentByTag(entry.getName());
    }

    fm.popBackStack();

    return topFrag;
}

0

यह आपको वर्तमान टुकड़ा वर्ग का नाम देगा ->

String fr_name = getSupportFragmentManager().findFragmentById(R.id.fragment_container).getClass().getSimpleName();

0
  1. ऑनस्टार्ट विधि में एक चेक (जो गतिविधि कंटेनर में टुकड़ा है) करें;

    @Override
    protected void onStart() {
    super.onStart();
    Fragment fragmentCurrent = getSupportFragmentManager.findFragmentById(R.id.constraintLayout___activity_main___container);
    }
  2. कुछ जाँच:

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