ID के लिए Android Fragment कोई दृश्य नहीं मिला?


287

मेरे पास एक टुकड़ा है जिसे मैं एक दृश्य में जोड़ने की कोशिश कर रहा हूं।

FragmentManager fragMgr=getSupportFragmentManager();
feed_parser_activity content = (feed_parser_activity)fragMgr
                                    .findFragmentById(R.id.feedContentContainer);
FragmentTransaction xaction=fragMgr.beginTransaction();

if (content == null || content.isRemoving()) {
    content=new feed_parser_activity(item.getLink().toString());
    xaction
        .add(R.id.feedContentContainer, content)
        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
        .addToBackStack(null)
        .commit();
    Log.e("Abstract", "DONE");
}

जब इस कोड को निष्पादित किया जाता है, तो मुझे डीबग में निम्न त्रुटि मिलती है ..

java.lang.IllegalArgumentException: No view found for id 0x7f080011 
   for fragment feed_parser_activity{41882f50 #2 id=0x7f080011}

feed_parser_activityएक Fragment है जो Xml में Fragment लेआउट पर सेट होता है।
मैं फ्रैगमेंट लेआउट को होस्ट करने के लिए एक FragmentActivity का उपयोग कर रहा हूं feed_parser_layout
क्या मैं इसे ठीक से ऊपर कोड कर रहा हूं?


3
क्या आप XML को शामिल कर सकते हैं?
jsmith

1
गतिविधि में सेट
पावेल

जवाबों:


374

मुझे भी यह समस्या हो रही थी, जब तक मुझे एहसास नहीं हुआ कि मैंने फ्रेगमेंटएक्टिविटी setContentView()की onCreate()पद्धति के गलत लेआउट को निर्दिष्ट कर दिया है ।

आईडी FragmentTransaction.add()आपके मामले में पारित हो गई है , इसमें R.id.feedContentContainerनिर्दिष्ट लेआउट का एक बच्चा होना चाहिए setContentView()

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


5
सेटऑनटेंटव्यू में निर्दिष्ट लेआउट के बच्चे से आपका क्या मतलब है? इसे बच्चा कैसे बनाएं?
निंजाकोडर

11
एक दृश्य दूसरे दृश्य का एक बच्चा है यदि XML में मूल दृश्य के अंदर घोषित किया गया है। अर्थात। एक के TextViewअंदर RelativeLayoutएक बच्चा है RelativeLayout
Howettl 19

@howettl: मुझे पता है कि यह थोड़ा पुराना पोस्ट है। लेकिन मैं आपके उत्तर के साथ इस मुद्दे को ठीक नहीं कर पा रहा हूं। यहाँ SO प्रश्न है: stackoverflow.com/questions/25844394/… - क्या आप कृपया मुझे इसमें मदद कर सकते हैं? धन्यवाद!
TheDevMan

@ कैसे, क्या आप इसी तरह के मुद्दे के साथ मेरी मदद कर सकते हैं। stackoverflow.com/questions/26966623/…
वामसी छल्ला

3
मेरे साथ हुआ। CTRL + C CTRL + V के नकारात्मक पक्ष।
एक्सएक्सएक्स

296

यह त्रुटि तब भी होती है जब फ्रेगमेंट्स को नेस्टेड कर दिया जाता है और getChildFragmentManager () के बजाय getSupportFragmentManager () के साथ जोड़ दिया जाता है।


10
मेरा दूसरा रास्ता गोल था। GetChildFragmentManager () को कॉल करने के साथ मुख्य खंड कंटेनर में जोड़ने का प्रयास कर रहा था। यह बताते हुए मेरे लिए इसे हल किया। धन्यवाद +1
speedynomads

@ मालचियास: क्या आप ViewPager के बारे में इस प्रश्न पर एक नज़र डाल सकते हैं? धन्यवाद stackoverflow.com/questions/27937250/...
होआ Vu

यह वास्तव में मेरी समस्या थी, धन्यवाद। अजीब हालांकि, यह केवल लैंडस्केप ओरिएंटेशन में हुआ है जब .show ()। इसका उपयोग मुख्य टुकड़े को बदलने के लिए ठीक काम किया।
कोहेनदेयर 20

1
यह वास्तव में मेरी समस्या थी, बहुत-बहुत धन्यवाद! यह केवल कुछ धीमे उपकरणों पर हो रहा था, इसलिए यह समझना कठिन था कि वास्तव में क्या हो रहा है।
यवरनेस

1
इस सवाल के आने के बाद कई बार मुझे लगा कि किसी और को मेरी समस्या नहीं है, बस थोड़ा नीचे स्क्रॉल करना पड़ा। यह अच्छा होगा यदि उन्हें यह कहने के लिए त्रुटि कोड अधिक विशिष्ट हो सकता है कि यह मामला हो सकता है।
KodyVanRy

67

समाधान का उपयोग करना था getChildFragmentManager()

के बजाय getFragmentManager()

जब एक टुकड़े से बुला रहा है। यदि आप किसी गतिविधि से विधि को बुला रहे हैं, तो उपयोग करें getFragmentManager()

यही समस्या का समाधान करेगा।


4
getSupportFragmentManager()इसके बजाय @ surfer190 का उपयोग करें ।
अमीर होसैन घासेमी

GetChildFragmentManager () और यह काम करता है !!
श्याम

मेरे मामले में मैं नीचे शीट के टुकड़े में व्यूपेजर का उपयोग करके टुकड़ा नेविगेशन का उपयोग कर रहा था। आपका समाधान शानदार ढंग से काम किया !! थैंक्स भाई के टोंस।
देबाशीष घोष

1
एक ही समस्या थी और यह मेरे लिए इसे हल कर दिया! getChildFragmentManager () getActivity () के बजाय getFragmentManager () जो समझ में आता है एक बार मैं इसके बारे में सोचा :) TY!
साइमन

मैं एक गतिविधि से विधि को बुला रहा हूं getFragmentManager(), लेकिन अब पदावनत कर दिया गया है!
अलीरज़ा नूराली

29

मुझे यह समस्या थी (कोड में अपना UI बनाते समय) और यह मेरे ViewPager(जो दिखाया गया था) के कारण Fragmentआईडी सेट नहीं था, इसलिए मैंने बस इस्तेमाल किया pager.setID(id)और फिर यह काम किया।

इस पृष्ठ ने मुझे यह पता लगाने में मदद की।


1
जब दृश्यदर्शी का उपयोग किया गया तो मुझे भी यही समस्या थी। लेनदेन करने से पहले viewPager.setCurrentItem (n) का उपयोग करके एक ही त्रुटि को ठीक किया गया था। शायद यह किसी के लिए उपयोगी होगा।
कर्क हैममेट

मेरे मामले में एक समान दिशा में था, लेकिन समस्या यह थी कि मैंने .setID में एक नकारात्मक मूल्य का उपयोग किया था। सकारात्मक पूर्णांक का उपयोग करने से समस्या हल हो गई।
इग्नासियो हागोपियन

29

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

जब आप भीतर के टुकड़े (पृष्ठदृश्य का पृष्ठ) में फ्रैगमेंट लेनदेन करते हैं, तो आपको आवश्यकता होगी

FragmentManager fragmentManager = getActivity().getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

getActivity () यहां कुंजी है। ...


हाँ ... मेरे लिए अन्य सभी कार्यान्वयन इसके अलावा ठीक थे। मैंने सीधे इस तरह से कोड का उपयोग करने की कोशिश की है: FragmentTransaction transaction = getSupportFragmentManager ()। startTransaction (); फिर मैंने अलग-अलग getActivity () का उपयोग करके टुकड़ा करने वाला व्यक्ति प्राप्त किया जैसे आपने उल्लेख किया है। यह बहुत अच्छा काम करता है
औरंग क्रिश

18

मेरे मामले में मैं एक पेजर युक्त डायलॉगफ्रेगमेंट दिखाने की कोशिश कर रहा था और यह अपवाद तब फेंका गया जब FragmentPagerAdapter ने पेजर में फ्रेगमेंट जोड़ने का प्रयास किया। Howettl जवाब के आधार पर मुझे लगता है कि यह पेजर माता-पिता के कारण मेरी फ्रैगमेंटएक्टिविटी में setContentView () में सेट नहीं था।

समस्या को हल करने के लिए मैंने जो एकमात्र बदलाव किया, वह था FragmentPagerAdapter को एक FragmentMager में पास करके getChildFragmentManager () कॉल करना, न कि getFragmentManager () कॉल करके प्राप्त किया गया।

    public class PagerDialog extends DialogFragment{

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

        View rootView = inflater.inflate(R.layout.pager_dialog, container, false);

        MyPagerAdapter pagerAdapter = new MyPagerAdapter(getChildFragmentManager());
        ViewPager pager = (ViewPager) rootView.findViewById(R.id.pager);
        pager.setAdapter(pagerAdapter);

        return rootView;
    }
}

getChildFragmentManager () डायलॉगफ्रैगमेंट से सुलभ नहीं है
अब्दाल्रहमान शतो

14

यह अपवाद तब भी हो सकता है यदि आप जिस लेआउट आईडी FragmentTransaction.replace(int ID, fragment)को अन्य लेआउट में प्रवाहित कर रहे हैं, वह मौजूद है। सुनिश्चित करें कि लेआउट आईडी अद्वितीय है और इसे काम करना चाहिए।


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

13

एक उत्तर मैं इस तरह से एक और धागे पर पढ़ा जो मेरे लिए काम करता था जब मुझे यह समस्या होती थी, जिसमें लेआउट xml शामिल था।

आपका लॉगकैट कहता है "आईडी 0x7f080011 के लिए कोई दृश्य नहीं मिला"।

खोलो gen->package->R.java->idऔर फिर आईडी के लिए देखो 0x7f080011

जब मुझे यह समस्या थी, यह आईडी FrameLayoutमेरी activity_main.xmlफ़ाइल में थी।

फ़्रेमलैटआउट में एक आईडी नहीं थी (कोई बयान नहीं था android:id = "blablabla")।

सुनिश्चित करें कि आपके सभी लेआउट में आपके सभी घटकों में आईडी है, विशेष रूप से लॉगकैट में उद्धृत घटक।


1
अच्छा लगा। Android Studio w / LinuxOS में यह यहाँ है: / home / bob / AndroidStudioWorkspace / HelloWorld / app / build / generate / source / r / release / Android / support / v7 / appcompat।
पोर्ट्समप्लांट

11

जब मैं से उन्नत बनाया मैं यह त्रुटि आई com.android.support:support-v4:21.0.0के लिए com.android.support:support-v4:22.1.1

मुझे इससे अपना लेआउट बदलना पड़ा:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container_frame_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</FrameLayout> 

इसके लिए:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/container_frame_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>

</FrameLayout> 

इसलिए लेआउट MUST में एक बच्चा दृश्य है। मैं मान रहा हूं कि उन्होंने इसे नए पुस्तकालय में लागू किया है।


9

नेस्टेड टुकड़ों के साथ

हल दुर्घटना के getChildFragmentManager()बजाय का उपयोग करके मेरे लिएgetActivity().getSupportFragmentManager()

java.lang.IllegalArgumentException: आईडी के लिए कोई दृश्य नहीं मिला


लेकिन अडैप्टर कैंट के अंदर getchildFragmentManger क्यों
सुनील चौधरी

8

मुझे पता है कि यह पहले से ही एक परिदृश्य के लिए उत्तर दिया गया है, लेकिन मेरी समस्या थोड़ी अलग थी और मुझे लगा कि अगर मेरे जूते में कोई और है तो मैं साझा करूंगा।

मैं एक लेन-देन कर रहा था onCreate(), लेकिन इस बिंदु पर पेड़ को नहीं उगाया गया है, इसलिए आपको यह त्रुटि मिलती है। लेन-देन कोड डालकर onResume()सब कुछ ठीक चलता है।

तो बस यह सुनिश्चित करें कि दृश्य ट्री के फुलाए जाने के बाद आपका लेनदेन कोड चलता है!


3
हम्म ... मेरे मामले में इससे कोई फ़र्क नहीं पड़ा कि ऐसा कोड onCreate या onResume में था
IgGanapolsky

मेरे मामले में @IgorGanapolsky ने यह भी हल किया कि टुकड़े से कॉलबैक के साथ onAttach। मेरा उत्तर
अलेक्जेंडर मालाखोव

यह मेरी समस्या बिल्कुल थी। व्यू स्टेट को रिफ्रेश करने के लिए दूसरे वर्ग को कॉल एक लेआउट पर एक टुकड़ा लेनदेन कर रहा था जो अभी तक फुलाया नहीं गया था। इसे onResume () में कॉल करके समस्या को ठीक किया गया।
AWT

8

जब मैं पुनर्नवीनीकरण दृश्य के भीतर Viewpager का उपयोग कर एक बुरा त्रुटि का सामना कर रहा था। नीचे एक विशेष स्थिति में त्रुटि का सामना करना पड़ा। मैंने एक टुकड़ा शुरू किया, जिसमें व्यूपेजर के साथ एक रीसायकलर (FragmentStatePagerAdapter का उपयोग करके) था। यह तब तक अच्छी तरह से काम करता रहा जब तक कि मैंने RecyclerView में एक सेल के क्लिक पर अलग-अलग टुकड़े में स्विच नहीं किया, और फिर फोन के हार्डवेयर बैक बटन का उपयोग करके वापस नेविगेट किया और ऐप क्रैश हो गया।

और इस बारे में मजेदार बात यह है कि मेरे पास एक ही RecyclerView में दो Viewpagers थे और दोनों लगभग 5 सेल दूर थे (अन्य स्क्रीन पर दिखाई नहीं दे रहा था, यह नीचे था)। इसलिए शुरू में मैंने सिर्फ पहले Viewpager पर समाधान लागू किया और अन्य को छोड़ दिया जैसा कि यह है (Viewpager Fragments का उपयोग करके)।

जब पहली बार पेजर देखा जा सके, तो नेविगेट करने में ठीक काम हुआ। अब जब मैं नीचे दूसरी तरफ स्क्रॉल किया और फिर टुकड़ा बदल दिया और वापस आ गया, यह दुर्घटनाग्रस्त हो गया (एक ही चीज़ पहले एक के साथ हुई)। इसलिए मुझे दोनों Viewpagers को बदलना पड़ा।

वैसे भी, कार्यशील समाधान खोजने के लिए नीचे पढ़ें। नीचे क्रैश त्रुटि:

java.lang.IllegalArgumentException: No view found for id 0x7f0c0098 (com.kk:id/pagerDetailAndTips) for fragment ProductDetailsAndTipsFragment{189bcbce #0 id=0x7f0c0098}

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

कुछ भी काम नहीं किया।

अंत में FragmentStatePagerAdapter का उपयोग करने के बजाय, मैंने PagerAdapter को बढ़ाया और टुकड़ों के उपयोग के बिना Viewpager में इसका उपयोग किया। मेरा मानना ​​है कि जहां नेस्टेड टुकड़े के साथ एक बग है। वैसे भी, हमारे पास विकल्प हैं। पढ़ें ...

नीचे दिया गया लिंक बहुत मददगार था:

सुगंध के बिना दृश्य

लिंक मर सकता है इसलिए मैं यहाँ अपना कार्यान्वित समाधान पोस्ट कर रहा हूँ:

public class ScreenSlidePagerAdapter extends PagerAdapter {
private static final String TAG = "ScreenSlidePager";
ProductDetails productDetails;
ImageView imgProductImage;
ArrayList<Imagelist> imagelists;
Context mContext;

// Constructor
public ScreenSlidePagerAdapter(Context mContext,ProductDetails productDetails) {
    //super(fm);
    this.mContext = mContext;
    this.productDetails = productDetails;
}

// Here is where you inflate your View and instantiate each View and set their values
@Override
public Object instantiateItem(ViewGroup container, int position) {
    LayoutInflater inflater = LayoutInflater.from(mContext);
    ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.product_image_slide_cell,container,false);

    imgProductImage = (ImageView) layout.findViewById(R.id.imgSlidingProductImage);
    String url = null;
    if (imagelists != null) {
        url = imagelists.get(position).getImage();
    }

    // This is UniversalImageLoader Image downloader method to download and set Image onto Imageview
    ImageLoader.getInstance().displayImage(url, imgProductImage, Kk.options);

    // Finally add view to Viewgroup. Same as where we return our fragment in FragmentStatePagerAdapter
    container.addView(layout);
    return layout;
}

// Write as it is. I don't know much about it
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView((View) object);
    /*super.destroyItem(container, position, object);*/
}

// Get the count
@Override
public int getCount() {
    int size = 0;

    if (productDetails != null) {
        imagelists =  productDetails.getImagelist();
        if (imagelists != null) {
            size = imagelists.size();
        }
    }
    Log.d(TAG,"Adapter Size = "+size);
    return size;
}

// Write as it is. I don't know much about it
@Override
public boolean isViewFromObject(View view, Object object) {

    return view == object;
}

}

आशा है कि यह उपयोगी था !!


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

मेरा मानना ​​है कि इसका कारण यह है: stackoverflow.com/a/27966053/1377819
Hoang Nguyen Huu

7

मेरे पास एक ही मुद्दा था लेकिन मेरा मुद्दा अभिविन्यास परिवर्तन पर हो रहा था। अन्य समाधानों में से किसी ने भी काम नहीं किया। तो यह पता चला है कि मैं setRetainInstance(true);स्क्रीन के आकार के आधार पर दो या एक फलक लेआउट करते समय अपने टुकड़े से निकालना भूल गया था ।


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

5

मेरी गलती थी FragamentTransaction

मैं t.replace(R.layout.mylayout);इसके बजाय यह कर रहा थाt.replace(R.id.mylayout);

अंतर यह है कि एक लेआउट है और दूसरा एक संदर्भ है layout(id)


4

बस अगर किसी ने वही मूर्खतापूर्ण गलती की जो मैंने की; जाँच लें कि कहीं आप गतिविधि की सामग्री को अधिलेखित नहीं कर रहे हैं (यानी सेट-कॉन्टेंट व्यू के लिए अतिरिक्त कॉल देखें)

मेरे मामले में, लापरवाह प्रतिलिपि और चिपकाने के कारण, मैंने DataBindingUtil.inflate के बजाय अपने टुकड़े में DataBindingUtil.setContentView का उपयोग किया, जिसने गतिविधि की स्थिति को गड़बड़ कर दिया।


3

मेरे पास यही मुद्दा था, मुझे अपना कोड पोस्ट करने देना चाहिए ताकि आप सभी इसे देख सकें, और जो मैंने किया था, वही काम न करें।

@Override
protected void onResume()
{
    super.onResume();

    fragManager = getSupportFragmentManager();

    Fragment answerPad=getDefaultAnswerPad();
    setAnswerPad(answerPad);
    setContentView(R.layout.abstract_test_view);
}
protected void setAnswerPad(AbstractAnswerFragment pad)
{
    fragManager.beginTransaction()
        .add(R.id.AnswerArea, pad, "AnswerArea")
        .commit();
    fragManager.executePendingTransactions();
}

ध्यान दें कि मैं पहले टुकड़े कर रहा था setContentView। ओह।


1
धन्यवाद! मैं एक ही काम कर रहा था, इसलिए मैंने अपने setContentViewअंदर डाल दियाonBuildHeaders
रेंडी

3

यह पृष्ठ Fragment IllegalArgumentException के बारे में सुझाव पोस्ट करने के लिए एक अच्छा केंद्रीय स्थान प्रतीत होता है। यहाँ एक और चीज़ है जिसे आप आज़मा सकते हैं। यह वही है जो आखिरकार मेरे लिए काम करता है:

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


एक अलग नोट पर, यदि आपने पहले ही इस पृष्ठ (और संपूर्ण इंटरनेट, भी) पर सुझाए गए अन्य सभी चीज़ों की कोशिश की है और अपने बालों को घंटों तक खींच रहे हैं, तो बस इन कष्टप्रद टुकड़ों को डंप करने और एक अच्छे पुराने मानक लेआउट पर वापस जाने पर विचार करें। (यह वास्तव में मैं क्या करने की प्रक्रिया में था जब मैंने आखिरकार अपनी समस्या की खोज की।) आप अभी भी कंटेनर अवधारणा का उपयोग कर सकते हैं। हालाँकि, इसे एक टुकड़े से भरने के बजाय, आप xml includeटैग का उपयोग इसे उसी लेआउट से भरने के लिए कर सकते हैं जिसका उपयोग आपने अपने टुकड़े में किया होगा। आप अपने मुख्य लेआउट में ऐसा कुछ कर सकते हैं:

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <include layout="@layout/former_fragment_layout" />

</FrameLayout>

जहां former_fragment_layoutxml लेआउट फ़ाइल का नाम है जिसे आप अपने टुकड़े में उपयोग करने की कोशिश कर रहे थे। अधिक जानकारी के लिए शामिल लेआउट का पुनः उपयोग करना देखें ।


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

मैं निश्चित रूप से सहमत हूं। टुकड़े कहीं बेहतर हैं।
सुरगाच

2

मेरे मामले में मेरे पास एक पुनर्नवीनीकरण दृश्य आइटम में एक SupportMapFragment था (मैं निचले ओवरहेड "liteMode" का उपयोग कर रहा था जो मानचित्र को गैर-संवादात्मक, लगभग एक स्थिर छवि की तरह दिखाई देता है)। मैं सही FragmentManager का उपयोग कर रहा था, और सब कुछ ठीक काम करता दिखाई दिया ... एक छोटी सूची के साथ। एक बार जब आइटम की सूची स्क्रीन की ऊंचाई से थोड़ा अधिक हो गई तो मुझे स्क्रॉल करते समय यह समस्या होने लगी।

यह पता चला कि ऐसा इसलिए था क्योंकि मैं एक डायनेमिक सपोर्टपावरफ्रेग्मेंट को एक दृश्य के अंदर इंजेक्ट कर रहा था, जो कि एक अन्य टुकड़े के अंदर था, कुछ मुद्दों के आसपास पाने के लिए जब मैं अपने एक्सएमएल में इसे सांख्यिकीय रूप से घोषित करने की कोशिश कर रहा था। इस वजह से, टुकड़ा प्लेसहोल्डर लेआउट केवल वास्तविक टुकड़े के साथ बदल दिया जा सकता है, जब एक बार खिड़की से जुड़ा हुआ था, यानी स्क्रीन पर दिखाई देता है। तो मैंने SupportMapFragment को शुरू करने के लिए अपना कोड डाल दिया था, Fragment की जगह, और onAttachedToWindow इवेंट में getMapAsync () कॉल कर रहा था।

मैं यह करना भूल गया कि यह सुनिश्चित करना कि मेरा कोड दो बार नहीं चला। यानी onAttachedToWindow इवेंट में, अगर मेरा डायनेमिक SupportMapFragment यह एक नया उदाहरण बनाने की कोशिश कर रहा था और एक Fragment प्रतिस्थापित करने से पहले अभी भी अशक्त था की जाँच करें। जब आइटम RecyclerView के शीर्ष पर चला जाता है, तो इसे विंडो से अलग कर दिया जाता है, फिर जब आप इसे वापस स्क्रॉल करते हैं, तो रिटेटेड हो जाता है, इसलिए यह इवेंट कई बार निकाल दिया जाता है।

एक बार जब मैंने अशक्त चेक जोड़ा, तो यह केवल एक बार RecyclerView आइटम के अनुसार हुआ और समस्या दूर हो गई! टी एल; डॉ!


2

यह तब होता है जब आप एक दूसरे के अंदर एक टुकड़े से बुला रहे हैं।

उपयोग :

getActivity().getSupportFragmentManager().beginTransaction();

1

मुझे इस समस्या का सामना करना पड़ा जब मैंने अपने टुकड़े के साथ दृश्य को बदलने का प्रयास किया onCreateView()। ऐशे ही:

public class MyProjectListFrag extends Fragment {


    private MyProjectListFragment myProjectListFragment;

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

        FragmentManager mFragmentManager = getFragmentManager();
        myProjectListFragment = new MyProjectListFragment();
        mFragmentManager
                .beginTransaction()
                .replace(R.id.container_for_my_pro_list,
                        myProjectListFragment, "myProjectListFragment")
                .commit();
    }

इसने मुझे बताया

11-25 14:06:04.848: E/AndroidRuntime(26040): java.lang.IllegalArgumentException: No view found for id 0x7f05003f (com.example.myays:id/container_for_my_pro_list) for fragment MyProjectListFragment{41692f40 #2 id=0x7f05003f myProjectListFragment}

तब मैंने इस मुद्दे को प्रतिस्थापित करने के साथ तय किया onActivityCreated()। ऐशे ही:

public class MyProjectListFrag extends Fragment {

    private final static String TAG = "lch";

    private MyProjectListFragment myProjectListFragment;

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

        return inflater
                .inflate(R.layout.frag_my_project_list, container, false);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);

        FragmentManager mFragmentManager = getFragmentManager();
        myProjectListFragment = new MyProjectListFragment();
        mFragmentManager
                .beginTransaction()
                .replace(R.id.container_for_my_pro_list,
                        myProjectListFragment, "myProjectListFragment")
                .commit();

    }
  1. आपको एक दृश्य वापस करना होगा onCreateView() ताकि आप इसे बाद में बदल सकें
  2. आप निम्न दृश्य में इस दृश्य की ओर कोई भी कार्य खंड में उठा सकते हैं, जैसे onActivityCreated()

उम्मीद है की यह मदद करेगा!


1

मैंने इस बग को ठीक कर दिया है, मैं commitNow()प्रतिस्थापित का उपयोग करता हूं commit()

mFragment.getChildFragmentManager()
  .beginTransaction()
  .replace(R.id.main_fragment_container,fragment)
  .commitNowAllowingStateLoss();

commitNowएक सिंक विधि है, commit()विधि एक async तरीका है।


1

मेरे मामले में यह अपवाद तब डाला गया जब मैंने विभिन्न बिल्ड वेरिएंट के लिए उनमें से कई होने के दौरान एक ही लेआउट तत्व (टुकड़ा प्लेसहोल्डर) के लिए अलग-अलग आईडी का उपयोग किया। किसी कारण से यह पूरी तरह से अच्छी तरह से काम करता है जब आप पहली बार टुकड़े की जगह ले रहे हैं, लेकिन यदि आप इसे फिर से करने की कोशिश करते हैं तो आपको यह अपवाद मिलता है। इसलिए सुनिश्चित करें कि आप एक ही आईडी का उपयोग कर रहे हैं यदि आपके पास विभिन्न बिल्ड वेरिएंट के लिए कई लेआउट हैं।


0

यदि आप एक टुकड़े के साथ एक टुकड़े को बदलने की कोशिश कर रहे हैं, fragmentManagerलेकिन आप माता-पिता के टुकड़े को नहीं बढ़ा रहे हैं जो एक समस्या पैदा कर सकता है।

में BaseFragment.java OnCreateView :

if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .replace(R.id.container, new DifferentFragment())
                    .commit();
        }

return super.onCreateView(inflater, container, savedInstanceState);

super.onCreateView(inflater, container, savedInstanceState); टुकड़े के लिए सही लेआउट को बदलने के साथ बदलें :

        return inflater.inflate(R.layout.base_fragment, container, false);

0

मुझे वही समस्या है जब गतिविधि निर्माण के दौरान खंड लेनदेन कर रहा था।

मुख्य समस्या यह है कि निक पहले ही बता चुके हैं - दृश्य पेड़ अभी तक फुलाया नहीं गया है। लेकिन उसका समाधान काम नहीं आया - onResume, onPostCreate आदि में समान अपवाद।

समाधान के लिए कंटेनर टुकड़ा में कॉलबैक जोड़ने के लिए तैयार है जब यह तैयार है:

public class MyContainerFragment extends Fragment {
    public static interface Callbacks {
        void onMyContainerAttached();
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        Log.d(TAG, "--- onAttach");
        ((Callbacks) activity).onMyContainerAttached();
    }

    //... rest of code
}

और फिर गतिविधि में:

public class MainActivity extends Activity
        implements MyContainerFragment.Callbacks
{
    @Override
    public void onMyContainerAttached() {
        getFragmentManager()
                .beginTransaction()
                .replace(R.id.containerFrame, new MyFragment())
                .commit();
    }

    //...
}

0

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


0

यह समस्या तब भी होती है जब आप <include layout="@layout/your_fragment_layout"/>अपने में नहीं डालते हैंapp_bar_main.xml


0

यह तब भी होता है जब आप एक ही आईडी के साथ दो टुकड़ों में दो विचार रखते हैं


यह गलत है। इस स्थिति में, कोड भी संकलित नहीं होगा।
तसलीम ओसेनी

0

मुझे वही समस्या थी, जो इसलिए हुई क्योंकि मैंने कंटेनर लेआउट को गतिविधि में जोड़ने से पहले टुकड़े जोड़ने की कोशिश की थी।


0

कभी-कभी ऐसा इसलिए होता है क्योंकि आप एक बॉटमवेशन व्यू का उपयोग कर रहे हैं। यदि आप नेविगेशन से एक इरादे को खोलते हैं और उस गतिविधि में आप एक खंड खोलते हैं तो कहने दें

transaction.replace(R.id.container,new YourFragment());

तब गतिविधि आपके द्वारा उपयोग किए जा रहे नेविगेशन विधि को खोजने में सक्षम नहीं होगी।

समाधान: अपने ऐप में addOnBackStack के साथ नेविगेशन को टुकड़ा करने और संभालने के लिए गतिविधि बदलें। यदि आपने जेटपैक नेविगेशन लागू किया है तो अपने प्रोजेक्ट में केवल टुकड़ों का उपयोग करें।


0

मेरे मामले में। मैं एक है Activityserveral साथ Fragmentपुन: बनाने के कुछ समय मैं जरूरत Fragmentरों जब

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

    उदाहरण के लिए

    Activity{
        fragment
        recreate{
           fragment = null then new instance
        }
    
    }
    
    Fragment{
        if((activity).fragment != null) {
           findViewById()
        }
    
    }
    हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
    Licensed under cc by-sa 3.0 with attribution required.