Android Fragment keine Ansicht für ID gefunden?

287

Ich habe ein Fragment, das ich einer Ansicht hinzufügen möchte.

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, wird beim Debuggen der folgende Fehler angezeigt.

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

feed_parser_activityist ein Fragment, das in XML auf Fragmentlayout festgelegt ist.
Ich verwende eine FragmentActivity, um das Fragment-Layout mit dem zu hosten feed_parser_layout.
Codiere ich das oben richtig?

coder_For_Life22
quelle
3
Können Sie das XML einschließen?
Schmied
1
Man kann den gleichen Fehler erhalten, wenn man eine Fragmenttransaktion durchführt, bevor man setContentView in Activity
Pavel

Antworten:

373

Ich hatte auch dieses Problem, bis mir klar wurde, dass ich in setContentView()der onCreate()Methode der FragmentActivity das falsche Layout angegeben hatte .

Die übergebene ID FragmentTransaction.add()muss in Ihrem Fall R.id.feedContentContainerein untergeordnetes Element des unter angegebenen Layouts sein setContentView().

Sie haben uns Ihre onCreate()Methode nicht gezeigt , vielleicht ist dies das gleiche Problem.

howettl
quelle
5
Was meinen Sie mit dem in setContentView angegebenen untergeordneten Layout? Wie macht man es zum Kind?
NinjaCoder
11
Eine Ansicht ist ein untergeordnetes Element einer anderen Ansicht, wenn sie in der übergeordneten Ansicht im XML deklariert ist. dh. Ein TextViewInneres von a RelativeLayoutist ein Kind von RelativeLayout.
Howettl
@howettl: Ich weiß, es ist ein bisschen alter Beitrag. Aber ich kann dieses Problem mit Ihrer Antwort nicht beheben. Hier ist SO Frage: stackoverflow.com/questions/25844394/… - Können Sie mir bitte dabei helfen? Vielen Dank!
TheDevMan
@howettl, können Sie mir bitte bei ähnlichen Problemen helfen. stackoverflow.com/questions/26966623/…
Vamsi Challa
3
Passierte mir. Der Nachteil von STRG + C STRG + V.
0nyx
295

Dieser Fehler tritt auch auf, wenn Fragmente verschachtelt und mit getSupportFragmentManager () anstelle von getChildFragmentManager () hinzugefügt wurden.

Malachiasz
quelle
10
Meins war umgekehrt. Ich habe versucht, mit dem Aufruf von getChildFragmentManager () zum Hauptfragmentcontainer hinzuzufügen. Der Hinweis darauf löste es für mich. Danke +1
speedynomads
@ Malachiasz: Könnten Sie sich diese Frage zu ViewPager ansehen? Vielen Dank, dass Sie stackoverflow.com/questions/27937250/…
Hoa Vu
Das war genau mein Problem, danke. Seltsamerweise trat dies jedoch nur im Querformat auf, wenn .show () aufgerufen wurde. Das Ersetzen des Hauptfragments hat einwandfrei funktioniert.
Cohenadair
1
Das war genau mein Problem, vielen Dank! Es passierte nur bei einigen langsamen Geräten, daher war es schwer zu verstehen, was genau passierte.
YawaraNes
1
Nachdem ich mehrmals zu dieser Frage gekommen war, hatte ich das Gefühl, dass niemand mein Problem hatte, sondern nur ein wenig nach unten scrollen musste. Es wäre schön, wenn sie den Fehlercode genauer beschreiben könnten, um zu sagen, dass dies der Fall sein könnte.
KodyVanRy
67

Die Lösung war zu verwenden getChildFragmentManager()

anstatt getFragmentManager()

beim Aufruf von einem Fragment. Wenn Sie die Methode aus einer Aktivität aufrufen, verwenden Sie getFragmentManager().

Das wird das Problem lösen.

Sterling Diaz
quelle
4
@ surfer190 getSupportFragmentManager()stattdessen verwenden.
Amir Hossein Ghasemi
Geändert zu getChildFragmentManager () und das funktioniert !!
Shyam
In meinem Fall habe ich die Fragmentnavigation mit dem Viewpager im unteren Blattfragment verwendet. Ihre Lösung hat hervorragend funktioniert !! Tonnenweise danke Bruder.
Debasish Ghosh
1
hatte das gleiche Problem und das löste es für mich! getChildFragmentManager () anstelle von getActivity (). getFragmentManager (), was Sinn macht, wenn ich darüber nachdenke :) TY!
Simon
Ich rufe die Methode aus einer Aktivität auf, bin aber getFragmentManager()jetzt veraltet!
Alireza Noorali
29

Ich hatte dieses Problem (beim Erstellen meiner Benutzeroberfläche in Code) und es wurde dadurch verursacht, ViewPagerdass (das zeigte Fragments) keine ID festgelegt hatte, also habe ich es einfach verwendet pager.setID(id)und dann hat es funktioniert.

Diese Seite hat mir geholfen, das herauszufinden.

Kaka
quelle
1
Ich hatte das gleiche Problem bei der Verwendung von viewPager. Der gleiche Fehler wurde mithilfe von viewPager.setCurrentItem (n) vor der Ausführung der Transaktion behoben. Vielleicht ist es für jemanden nützlich.
Kirk Hammett
In meinem Fall ging es in eine ähnliche Richtung, aber das Problem war, dass ich in .setID einen negativen Wert verwendet habe. Die Verwendung einer positiven Ganzzahl löste das Problem.
Ignacio Hagopian
29

Ein anderes Szenario, das ich getroffen habe. Wenn Sie verschachtelte Fragmente verwenden, sagen Sie einen ViewPager in einem Fragment mit seinen Seiten auch Fragmente.

Wenn Sie eine Fragmenttransaktion im inneren Fragment (Seite von ViewPager) ausführen, benötigen Sie

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

getActivity () ist hier der Schlüssel. ...

zdd
quelle
Ja ... für mich war jede andere Implementierung in Ordnung. Ich habe direkt versucht, auf den Code wie folgt zuzugreifen: FragmentTransaction transaction = getSupportFragmentManager (). BeginTransaction (); Dann habe ich den Fragmentmanager mit getActivity () separat bekommen, wie Sie erwähnt haben. Es funktioniert hübsch
anand krish
18

In meinem Fall habe ich versucht, ein DialogFragment anzuzeigen, das einen Pager enthält, und diese Ausnahme wurde ausgelöst, als der FragmentPagerAdapter versuchte, die Fragmente dem Pager hinzuzufügen. Basierend auf der Howettl-Antwort denke ich, dass es an dem übergeordneten Pager lag, dass nicht die in setContentView () in meiner FragmentActivity festgelegte Ansicht war.

Die einzige Änderung, die ich vorgenommen habe, um das Problem zu lösen, bestand darin, den FragmentPagerAdapter zu erstellen, der in einem FragmentMager übergeben wird, der durch Aufrufen von getChildFragmentManager () erhalten wurde, und nicht durch Aufrufen von getFragmentManager (), wie ich es normalerweise tue.

    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;
    }
}
Garibay
quelle
getChildFragmentManager () ist nicht zugänglich von DialogFragment
Abdalrahman Shatou
14

Diese Ausnahme kann auch auftreten, wenn die Layout-ID, an die Sie übergeben, FragmentTransaction.replace(int ID, fragment)in anderen Layouts vorhanden ist, die aufgeblasen werden. Stellen Sie sicher, dass die Layout-ID eindeutig ist und funktionieren sollte.

ealihodzic
quelle
Der Compiler meldet nicht, ob die ID im aktuellen Layout fehlt, wenn sie nicht eindeutig ist. Daher besteht das eigentliche Problem nicht in der Eindeutigkeit der ID, sondern darin, dass die ID im aktuellen Layout weggelassen wird.
Samuel
13

Eine Antwort, die ich in einem anderen ähnlichen Thread gelesen habe, der für mich funktioniert hat, als ich dieses Problem hatte, betraf das Layout xml.

Ihr Logcat sagt "Keine Ansicht für ID 0x7f080011 gefunden".

Öffnen Sie die gen->package->R.java->idund suchen Sie nach ID 0x7f080011.

Als ich dieses Problem hatte, gehörte diese ID zu a FrameLayoutin meiner activity_main.xmlDatei.

Das FrameLayout hatte keine ID (es gab keine Anweisung android:id = "blablabla").

Stellen Sie sicher, dass alle Ihre Komponenten in allen Ihren Layouts IDs haben, insbesondere die im Logcat angegebene Komponente.

Scottysseus
quelle
1
Nett. In Android Studio mit LinuxOS ist es hier: / home / bob / AndroidStudioWorkspace / HelloWorld / app / build / generate / source / r / release / android / support / v7 / appcompat.
Portsample
11

Ich habe diesen Fehler beim Upgrade von com.android.support:support-v4:21.0.0auf erhalten com.android.support:support-v4:22.1.1.

Ich musste mein Layout davon ändern:

<?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> 

Dazu:

<?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> 

Das Layout muss also eine untergeordnete Ansicht haben. Ich gehe davon aus, dass sie dies in der neuen Bibliothek durchgesetzt haben.

Oh nein
quelle
9

Mit verschachtelten Fragmenten

Für mich mit getChildFragmentManager()anstelle von getActivity().getSupportFragmentManager()gelöstem Absturz

java.lang.IllegalArgumentException: Keine Ansicht für ID gefunden

UdayaLakmal
quelle
aber innerhalb des Adapters kann getchildFragmentManger nicht imprt warum
Sunil Chaudhary
8

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 steckt.

Ich habe eine Transaktion innerhalb ausgeführt onCreate(), aber zu diesem Zeitpunkt wurde der Ansichtsbaum noch nicht aufgeblasen, sodass Sie denselben Fehler erhalten. Durch das Eingeben des Transaktionscodes lief onResume()alles einwandfrei.

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

Nick
quelle
3
Hmm ... in meinem Fall machte es keinen Unterschied, ob sich ein solcher Code in onCreate oder onResume befand
IgorGanapolsky
@IgorGanapolsky auch in meinem Fall löste das mit Rückruf von Fragmenten onAttach. Siehe meine Antwort
Alexander Malakhov
Das war genau mein Problem. Ein Aufruf einer anderen Klasse zum Aktualisieren eines Ansichtsstatus führte eine Fragmenttransaktion für ein Layout aus, das noch nicht aufgeblasen war. Durch Aufrufen von onResume () wurde das Problem behoben.
AWT
8

Bei der Verwendung von Viewpager in Recycler View ist ein böser Fehler aufgetreten. Unter Fehler stand ich in einer besonderen Situation. Ich habe ein Fragment gestartet, das eine RecyclerView mit Viewpager hatte (mit FragmentStatePagerAdapter). Es funktionierte gut, bis ich beim Klicken auf eine Zelle in RecyclerView zu einem anderen Fragment wechselte und dann mit der Hardware-Schaltfläche "Zurück" des Telefons zurück navigierte und die App abstürzte.

Und das Lustige daran war, dass ich zwei Viewpager in derselben RecyclerView hatte und beide ungefähr 5 Zellen entfernt waren (andere waren auf dem Bildschirm nicht sichtbar, sie waren ausgefallen). 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 einwandfrei, als der Pager für die erste Ansicht sichtbar war. Als ich jetzt zum zweiten gescrollt habe und dann das Fragment gewechselt habe und zurückgekommen bin, ist es abgestürzt (dasselbe ist mit dem ersten passiert). Also musste ich beide Viewpager wechseln.

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

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

Verbrachte Stunden damit, es zu debuggen. Lesen Sie diesen vollständigen Thread-Beitrag bis zum Ende und wenden Sie alle Lösungen an, einschließlich der Sicherstellung, dass ich childFragmentManager übergebe.

Nichts hat geklappt.

Anstatt FragmentStatePagerAdapter zu verwenden, habe ich PagerAdapter erweitert und in Viewpager verwendet, ohne Fragmente zu verwenden. Ich glaube einige, wo es einen BUG mit verschachtelten Fragmenten gibt. Wie auch immer, wir haben Optionen. Lesen ...

Der folgende Link war sehr hilfreich:

Viewpager ohne Fragmente

Der Link kann sterben, daher veröffentliche 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;
}

}}

Hoffe das war hilfreich !!

Nilesh
quelle
Ja, diese Lösung hat funktioniert, aber was ist, wenn ich eine schwierige Konstruktion mit eigenem Lebenszyklus und eigenen Variablen benötige, aber nicht nur Ansichten? Es wird mit VideoViews und ImageViews mit Wiedergabe- und Stummschalttasten verwendet. Nichts hilfreich für meinen Fall?
Nikita Axyonov
Ich glaube, das ist der Grund: stackoverflow.com/a/27966053/1377819
Hoang Nguyen Huu
7

Ich hatte das gleiche Problem, aber mein Problem trat bei einem Orientierungswechsel auf. Keine der anderen Lösungen funktionierte. Es stellt sich also heraus, dass ich vergessen habe, setRetainInstance(true);aus meinen Fragmenten zu entfernen , wenn ich ein Layout mit zwei oder einem Fenster basierend auf der Bildschirmgröße erstellt habe.

VM4
quelle
Wenn Sie sich in verschachtelten Fragmenten befinden, wird Ihre setRetainInstance (true) auf false gesetzt. Dadurch wird der Fehler behoben.
Ralphgabb
5

Mein Fehler war auf der FragamentTransaction.

Ich habe das t.replace(R.layout.mylayout);stattdessen gemachtt.replace(R.id.mylayout);

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

Mut tony
quelle
4

Nur für den Fall, dass jemand den gleichen dummen Fehler gemacht hat, den ich gemacht habe; Stellen Sie sicher, dass Sie den Aktivitätsinhalt nicht irgendwo überschreiben (dh suchen Sie nach zusätzlichen Aufrufen für setContentView).

In meinem Fall habe ich aufgrund von unachtsamem Kopieren und Einfügen DataBindingUtil.setContentView in meinem Fragment anstelle von DataBindingUtil.inflate verwendet, wodurch der Status der Aktivität durcheinander gebracht wurde.

Squimon
quelle
3

Ich hatte das gleiche Problem. Lassen Sie mich meinen Code veröffentlichen, damit Sie ihn alle sehen können, und nicht das Gleiche tun wie ich.

@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();
}

Beachten Sie, dass ich Fragmente vor mir eingerichtet habe setContentView. Hoppla.

PearsonArtPhoto
quelle
1
Danke dir! Ich habe das Gleiche getan, also habe ich mein setContentViewin meinonBuildHeaders
Randy
3

Diese Seite scheint ein guter zentraler Ort für die Veröffentlichung von Vorschlägen zur Fragment IllegalArgumentException zu sein. Hier ist noch eine Sache, die Sie versuchen können. Das hat endlich bei mir funktioniert:

Ich hatte vergessen, dass ich eine separate Layoutdatei für die Querformatausrichtung hatte. Nachdem ich dort auch meinen FrameLayout-Container hinzugefügt hatte, funktionierte das Fragment.


Wenn Sie bereits alles andere auf dieser Seite (und auch im gesamten Internet) vorgeschlagen und sich stundenlang die Haare ausgezogen haben, sollten Sie diese lästigen Fragmente einfach wegwerfen und zu einem guten alten Standardlayout zurückkehren. (Genau das war ich gerade, als ich endlich mein Problem entdeckte.) Sie können das Containerkonzept weiterhin verwenden. Anstatt es mit einem Fragment includezu füllen, können Sie es mit dem XML- Tag mit demselben Layout füllen, das Sie in Ihrem Fragment verwendet hätten. Sie könnten in Ihrem Hauptlayout so etwas tun:

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

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

</FrameLayout>

Wo former_fragment_layoutist der Name der XML-Layoutdatei, die Sie in Ihrem Fragment verwenden wollten? Weitere Informationen finden Sie unter Wiederverwenden von Layouts mit Include .

Suragch
quelle
Dies ist ein guter Vorschlag, aber es funktioniert nicht, wenn Fragmente dynamisch gewechselt werden müssen. Außerdem wird die Wiederverwendbarkeit verringert, da Sie das Verhalten (Code) in das Fragment einkapseln können.
Alexander Malakhov
Ich stimme definitiv zu. Fragmente sind viel besser.
Suragch
2

In meinem Fall hatte ich ein SupportMapFragment in einem Recycler-Ansichtselement (ich habe den unteren Overhead "liteMode" verwendet, wodurch die Karte als nicht interaktiv erscheint, fast wie ein statisches Bild). Ich habe den richtigen FragmentManager verwendet und alles schien gut zu funktionieren ... mit einer kleinen Liste. Sobald die Liste der Elemente die Bildschirmhöhe ein wenig überschritten hatte, trat dieses Problem beim Scrollen auf.

Es stellte sich heraus, dass ich ein dynamisches SupportMapFragment in eine Ansicht eingefügt habe, die sich in einem anderen Fragment befand, um einige Probleme zu umgehen, die ich hatte, als ich versuchte, es statisch in meinem XML zu deklarieren. Aus diesem Grund konnte das Fragment-Platzhalter-Layout nur dann durch das tatsächliche Fragment ersetzt werden, wenn die Ansicht an das Fenster angehängt wurde, dh auf dem Bildschirm sichtbar war. Also hatte ich meinen Code zum Initialisieren des SupportMapFragments, zum Ersetzen des Fragments und zum Aufrufen von getMapAsync () im Ereignis onAttachedToWindow eingegeben.

Was ich vergessen habe war sicherzustellen, dass mein Code nicht zweimal ausgeführt wurde. Überprüfen Sie im Ereignis onAttachedToWindow, ob mein dynamisches SupportMapFragment noch null war, bevor Sie versuchen, eine neue Instanz davon zu erstellen und ein Fragment zu ersetzen. Wenn das Element oben in der RecyclerView entfernt wird, wird es vom Fenster getrennt und beim Zurückblättern wieder angehängt, sodass dieses Ereignis mehrmals ausgelöst wird.

Nachdem ich die Nullprüfung hinzugefügt hatte, passierte sie nur einmal pro RecyclerView-Element und das Problem verschwand! TL; DR!

Breeno
quelle
2

Dies geschieht, wenn Sie von einem Fragment in einem anderen aufrufen.

verwenden :

getActivity().getSupportFragmentManager().beginTransaction();
Arvin Sanaei
quelle
1

Dieses Problem trat auf, als ich versuchte, die Ansicht durch mein Fragment in zu ersetzen onCreateView(). So was:

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

Es hat mir gesagt

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}

Dann habe ich dieses Problem mit dem Ersetzen behoben onActivityCreated(). So was:

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. Sie müssen eine Ansicht zurückgeben, onCreateView()damit Sie sie später ersetzen können
  2. Sie können jede Operation in Richtung dieser Ansicht in der folgenden Funktion in Fragment Liftcycle wie z onActivityCreated()

Hoffe das hilft!

Stephen Lin
quelle
1

Ich habe diesen Fehler behoben, ich benutze den commitNow()Ersatz commit().

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

Das commitNowist eine Synchronisationsmethode, die commit()Methode ist eine asynchrone Methode.

user1232595
quelle
1

In meinem Fall wurde diese Ausnahme ausgelöst, als ich verschiedene IDs für dasselbe Layoutelement (Fragmentplatzhalter) verwendete und mehrere davon für verschiedene Build-Varianten hatte. Aus irgendeinem Grund funktioniert es einwandfrei, wenn Sie das Fragment zum ersten Mal ersetzen. Wenn Sie es jedoch erneut versuchen, wird diese Ausnahme angezeigt. Stellen Sie also sicher, dass Sie dieselbe ID verwenden, wenn Sie mehrere Layouts für verschiedene Build-Varianten haben.

TK
quelle
0

Wenn Sie versuchen, ein Fragment innerhalb eines Fragments durch das zu ersetzen, fragmentManageraber das übergeordnete Fragment nicht aufblasen ein Problem verursachen kann.

In BaseFragment.java OnCreateView :

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

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

Ersetzen Sie super.onCreateView(inflater, container, savedInstanceState); durch Aufblasen das richtige Layout für das Fragment:

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

Ich hatte das gleiche Problem, als ich während der Aktivitätserstellung Fragmenttransaktionen durchführte.

Das Kernproblem ist das, worauf Nick bereits hingewiesen hat - der Ansichtsbaum wurde noch nicht aufgeblasen. Aber seine Lösung hat nicht funktioniert - die gleiche Ausnahme in onResume, onPostCreate usw.

Die Lösung besteht darin, dem Containerfragment einen Rückruf hinzuzufügen, um zu signalisieren, wann es bereit ist:

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
}

Und dann in Aktivität:

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

    //...
}
Alexander Malakhov
quelle
0

In meinem Fall habe ich eine Fragmentklassendatei verwendet, um eine Listview-Adapterklasse zu deklarieren. Ich habe gerade eine andere Datei für die öffentliche Adapterklasse verwendet und der Fehler war verschwunden.

Gauß
quelle
0

Dieses Problem tritt auch auf, wenn Sie <include layout="@layout/your_fragment_layout"/>Ihre nicht eingebenapp_bar_main.xml

Backen Sie Waikhom
quelle
0

Dies passiert auch, wenn Sie zwei Ansichten in zwei Fragmenten mit denselben IDs haben

Hossam Hassan
quelle
Das ist falsch. In diesem Fall würde der Code nicht einmal kompiliert.
Taslim Oseni
0

Ich hatte das gleiche Problem, das verursacht wurde, weil ich versucht habe, Fragmente hinzuzufügen, bevor ich das Containerlayout zur Aktivität hinzufügte.

Rohit
quelle
0

Manchmal liegt es daran, dass Sie eine BottomNavigationView verwenden. Wenn Sie eine Absicht über die Navigation öffnen und in dieser Aktivität ein Fragment öffnen, sagen wir

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

In diesem Fall kann die Aktivität die von Ihnen verwendete Navigationsmethode nicht finden.

LÖSUNG: Ändern Sie die Aktivität in fragmentieren und verwalten Sie die Navigation mit addOnBackStack in Ihrer App. Wenn Sie die Jetpack-Navigation implementiert haben, verwenden Sie einfach Fragmente in Ihrem Projekt.

Felipe Franco
quelle
0

In meinem Fall. Ich habe eine Zeit Activitymit mehreren Server, die Fragmentich neu erstellen muss, Fragmentwenn

  • Sprache ist Veränderung
  • Fragmentlayout Einige müssen nicht benötigt werden oder Inhaltsänderungen müssen neu erstellt werden
  • andere Änderungen
  • Ich lösche alle Fragments und setze alle aufnull lösche in Aktivität, aber Fragment erstellt sich bereits selbst, während die Host-Aktivität Bean auf Null gesetzt ist. Überprüfen Sie sie daher vor dem Aufruf der Fragmentansicht auf Null

    beispielsweise

    Activity{
        fragment
        recreate{
           fragment = null then new instance
        }
    
    }
    
    Fragment{
        if((activity).fragment != null) {
           findViewById()
        }
    
    }
    shuabing
    quelle