355 Stimmen

Android Fragment keine Ansicht für ID gefunden?

Ich habe ein Fragment, das ich versuche, in eine Ansicht hinzuzufügen.

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");
}

Wenn dieser Code ausgeführt wird, erhalte ich folgende Fehlermeldung in Debug

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

feed_parser_activity ist ein Fragment, das auf Fragment-Layout in xml eingestellt ist.
Ich verwende eine FragmentActivity zum Hosten des Fragment-Layouts, das die feed_parser_layout .
Habe ich das oben richtig kodiert?

10voto

Nick Punkte 441

Ich weiß, dass dies bereits für ein Szenario beantwortet wurde, aber mein Problem war etwas anders, und ich dachte, ich würde es teilen, falls jemand anderes in meinen Schuhen ist.

Ich habe eine Transaktion innerhalb onCreate() aber zu diesem Zeitpunkt ist der Ansichtsbaum noch nicht aufgeblasen worden, so dass Sie den gleichen Fehler erhalten. Wenn Sie den Transaktionscode in onResume() hat alles gut funktioniert.

Stellen Sie also sicher, dass Ihr Transaktionscode ausgeführt wird, nachdem der Ansichtsbaum aufgeblasen wurde!

8voto

Nilesh Punkte 516

Bei der Verwendung von Viewpager in der Recycler-Ansicht trat ein böser Fehler auf. Der untenstehende Fehler trat in einer speziellen Situation auf. Ich startete ein Fragment, das eine RecyclerView mit Viewpager (mit FragmentStatePagerAdapter) hatte. Es funktionierte gut, bis ich zu einem anderen Fragment auf Klick auf eine Zelle in RecyclerView gewechselt, und dann navigierte zurück mit Telefon-Hardware Zurück-Taste und App abgestürzt.

Und was ist lustig daran war, dass ich zwei Viewpager in der gleichen RecyclerView hatte und beide waren etwa 5 Zellen entfernt (andere war nicht sichtbar auf dem Bildschirm, es war unten). Also habe ich die Lösung zunächst nur auf den ersten Viewpager angewendet und den anderen so belassen, wie er ist (Viewpager mit Fragmenten).

Das Zurücknavigieren funktionierte problemlos, wenn der erste Pager angezeigt wurde. Wenn ich nun zum zweiten scrollte und dann das Fragment änderte und zurückkam, stürzte es ab (das Gleiche passierte mit dem ersten). Also musste ich die beiden Viewpager ändern.

Wie auch immer, lesen Sie unten, um eine funktionierende Lösung zu finden. Absturz Fehler unten:

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

Ich habe Stunden mit der Fehlersuche verbracht. Lesen Sie diese komplette Thread Beitrag bis zum Ende Anwendung alle Lösungen einschließlich der Sicherstellung, dass ich childFragmentManager übergeben.

Nichts hat funktioniert.

Schließlich anstelle der Verwendung von FragmentStatePagerAdapter , ich erweitert PagerAdapter und verwendet es in Viewpager ohne Verwendung von Fragmenten. Ich glaube, irgendwo gibt es einen BUG mit verschachtelten Fragmenten. Wie auch immer, wir haben Optionen. Lesen ...

Der untenstehende Link war sehr hilfreich:

Viewpager ohne Fragmente

Der Link kann verloren gehen, deshalb poste ich meine implementierte Lösung hier unten:

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;
}

}

Ich hoffe, das war hilfreich!

8voto

Squimon Punkte 581

Nur für den Fall, dass jemand denselben dummen Fehler gemacht hat wie ich: Überprüfen Sie, ob Sie den Inhalt der Aktivität nicht irgendwo überschreiben (d. h. suchen Sie nach zusätzlichen Aufrufen von setContentView)

In meinem Fall habe ich aufgrund von unvorsichtigem Kopieren und Einfügen DataBindingUtil.setContentView in meinem Fragment anstelle von DataBindingUtil.inflate verwendet, was den Zustand der Aktivität durcheinander gebracht hat.

7voto

VM4 Punkte 6181

Ich hatte das gleiche Problem, aber mein Problem trat beim Wechsel der Ausrichtung auf. Keine der anderen Lösungen hat funktioniert. Es stellte sich also heraus, dass ich vergessen hatte, die setRetainInstance(true); aus meinen Fragmenten, wenn ich ein Layout mit zwei oder einem Fenster je nach Bildschirmgröße verwende.

5voto

mut tony Punkte 309

Mein Fehler lag in der FragamentTransaction .

Ich habe dies getan t.replace(R.layout.mylayout); 代わりに t.replace(R.id.mylayout);

Der Unterschied besteht darin, dass das eine das Layout ist und das andere ein Verweis auf die layout(id)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X