webentwicklung-frage-antwort-db.com.de

Android Fragment keine Ansicht für ID gefunden?

Ich habe ein Fragment, das ich in eine Ansicht einfü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, erhalte ich den folgenden Fehler beim Debuggen.

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 in xml auf Fragmentlayout gesetzt ist.
Ich verwende eine FragmentActivity, um das Fragment-Layout mit dem feed_parser_layout zu hosten.
Codiere ich das oben richtig?

233

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

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

Sie haben uns Ihre onCreate()-Methode nicht gezeigt, daher ist dies möglicherweise dasselbe Problem.

316
howettl

Dieser Fehler tritt auch auf, wenn geschachtelte Fragmente vorhanden sind und diese mit getSupportFragmentManager () anstelle von getChildFragmentManager () hinzugefügt werden.

225
Malachiasz

Die Lösung war, getChildFragmentManager() zu verwenden.

anstelle von getFragmentManager()

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

Das wird das Problem lösen.

48
Sterling Diaz

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

Wenn Sie die Transaktion im inneren Fragment (Seite von ViewPager) fragmentieren, müssen Sie dies tun

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

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

25
zdd

Ich hatte dieses Problem (beim Erstellen meiner UI im Code) und es wurde dadurch verursacht, dass meine ViewPager (die Fragments zeigte) keinen ID-Satz hatte, also habe ich einfach pager.setID(id) verwendet und dann hat es funktioniert.

Diese Seite hat mir geholfen, das herauszufinden.

25
kaka

Ich habe diese Fehlermeldung erhalten, als ich von com.Android.support:support-v4:21.0.0 auf com.Android.support:support-v4:22.1.1 aktualisiert habe. 

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> 

Zu diesem:

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

Also das Layout MUSS habe eine Kinderansicht. Ich gehe davon aus, dass sie dies in der neuen Bibliothek durchgesetzt haben. 

11
ono

Eine Antwort, die ich in einem anderen Thread gelesen habe, der diesem ähnelt, der für mich funktionierte, als ich dieses Problem hatte, betraf die Layout-XML. 

Ihr Logcat sagt "Es wurde keine Ansicht für die ID 0x7f080011 gefunden". 

Öffnen Sie den gen->package->R.Java->id und suchen Sie nach der ID 0x7f080011.

Als ich dieses Problem hatte, gehörte diese ID zu einer FrameLayout in meiner activity_main.xml-Datei.

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

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

11
scottyseus

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

9
ealihodzic

In meinem Fall habe ich versucht, ein DialogFragment anzuzeigen, das einen Pager enthält. Diese Ausnahme wurde ausgelöst, als der FragmentPagerAdapter versuchte, die Fragmente zum Pager hinzuzufügen. Basierend auf der Howettl-Antwort schätze ich, dass es sich bei dem übergeordneten Pager-Element nicht um die in setContentView () in meiner FragmentActivity festgelegte Ansicht handelte.

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 () abgerufen wird, nicht der durch Aufrufen von getFragmentManager () wie üblich.

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);
    pagerAdapter.setAdapter(pagerAdapter);

    return rootView;
}

}

7
garibay

Ich hatte das gleiche Problem, aber mein Thema wurde über den Orientierungswechsel gelöst. Keine der anderen Lösungen funktionierte. Es stellte sich also heraus, dass ich vergessen habe, setRetainInstance(true); aus meinen Fragmenten zu entfernen, wenn ich ein Layout mit zwei oder einem Teilfenster basierend auf der Bildschirmgröße mache.

7
VM4

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 von onCreate() durchgeführt, aber zu diesem Zeitpunkt wurde der Ansichtsbaum nicht aufgebläht, so dass Sie denselben Fehler erhalten. Durch das Einfügen des Transaktionscodes in onResume() lief alles einwandfrei.

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

6
Nick

Mein Fehler war die FragamentTransaction.

Ich habe dies t.replace(R.layout.mylayout); anstelle von t.replace(R.id.mylayout); gemacht. 

Der Unterschied ist, dass einer das Layout und der andere eine Referenz auf die layout(id) ist.

5
mut tony

Bei der Verwendung von Viewpager in Recycler View war ein böser Fehler aufgetreten. Unterhalb des Fehlers befand ich mich in einer besonderen Situation. Ich startete ein Fragment, das eine RecyclerView mit Viewpager (mit FragmentStatePagerAdapter) hatte. Es hat gut funktioniert, bis ich beim Klicken auf eine Zelle in RecyclerView zu einem anderen Fragment gewechselt bin und dann mit der Zurück-Taste von Phone zurückgegangen bin und die App abgestürzt ist.

Das Witzige daran war, dass ich zwei Viewpager in demselben RecyclerView hatte und beide nur etwa 5 Zellen entfernt waren (andere waren auf dem Bildschirm nicht sichtbar, sie waren unten). Anfangs habe ich die Lösung also nur auf den ersten Viewpager angewendet und den anderen so belassen (Viewpager mit Fragmenten).

Zurück navigieren funktionierte gut, wenn der Pager für die erste Ansicht sichtbar war. Als ich nun zum zweiten scrollen und dann das Fragment veränderte und zurückkam, stürzte es ab (dasselbe passierte beim ersten). Also musste ich beide Viewpager wechseln.

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

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. Stellen Sie dabei sicher, dass ich childFragmentManager durchgehe.

Nichts hat geklappt.

Statt FragmentStatePagerAdapter zu verwenden, erweiterte ich schließlich PagerAdapter und verwendete es in Viewpager, ohne Fragmente zu verwenden. Ich glaube einige, wo es einen Fehler mit verschachtelten Fragmenten gibt. Wie auch immer, wir haben Optionen. Lesen ...

Der folgende Link war sehr hilfreich:

Viewpager ohne Fragmente

Der Link kann sterben, deshalb poste ich meine implementierte Lösung hier:

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

5
Nilesh

Mit verschachtelte Fragmente  

Mit getChildFragmentManager() anstelle von getActivity.getSupportFragmentManager() behobener Absturz Java.lang.IllegalArgumentException: Keine Ansicht für id für mich gefunden.

5
UdayaLakmal

Diese Seite scheint ein guter zentraler Ort zu sein, um Vorschläge zur Fragment IllegalArgumentException zu veröffentlichen. Hier ist eine weitere Sache, die Sie ausprobieren können. Das hat mir endlich geholfen:

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 das gesamte Internet) vorgeschlagen haben und Ihr Haar schon seit Stunden ausgezogen haben, sollten Sie diese lästigen Fragmente einfach abladen und zu einem guten alten Standardlayout zurückkehren. (Das war eigentlich das, was ich gerade tat, als ich endlich mein Problem entdeckte.) Sie können immer noch das Containerkonzept verwenden. Anstatt es mit einem Fragment zu füllen, können Sie es mit dem Tag xml include 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>

dabei ist former_fragment_layout der Name der XML-Layoutdatei, die Sie in Ihrem Fragment verwenden wollten. Weitere Informationen finden Sie unter Layouts mit include wiederverwenden.

3
Suragch

Ich hatte das gleiche Problem. Lassen Sie mich meinen Code posten, damit Sie ihn alle sehen können und nicht das Gleiche tun, was ich getan habe.

@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 vor dem setContentView Fragmente eingerichtet habe. Ooops 

3
PearsonArtPhoto

Nur für den Fall, dass jemand den gleichen dummen Fehler gemacht hat wie ich. Überprüfen Sie, ob Sie den Aktivitätsinhalt nicht irgendwo überschreiben (d. h. nach weiteren Aufrufen von setContentView suchen).

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

3
Squimon

In meinem Fall hatte ich ein SupportMapFragment in einem Recycler-Ansichtselement (ich verwendete den unteren Overhead "liteMode", 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. Nachdem die Liste der Elemente die Bildschirmhöhe etwas überschritten hatte, bekam ich beim Scrollen dieses Problem.

Es stellte sich heraus, dass ich ein dynamisches SupportMapFragment in eine Ansicht injiziert habe, das 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 Fragmentplatzhalter-Layout nur durch das tatsächliche Fragment ersetzt werden, wenn die Ansicht an das Fenster angehängt wurde, d. H. Auf dem Bildschirm sichtbar war. Also hatte ich meinen Code zum Initialisieren von SupportMapFragment, zum Ersetzen des Fragments und zum Aufrufen von getMapAsync () im onAttachedToWindow-Ereignis eingegeben.

Was ich vergessen habe, war sicherzustellen, dass mein Code nicht zweimal ausgeführt wurde. D.h. Prüfen Sie im onAttachedToWindow -Ereignis, ob mein dynamisches SupportMapFragment noch null war, bevor Sie versuchen, eine neue Instanz davon zu erstellen, und führen Sie ein Fragmentersetzen durch. Wenn das Element oben in der RecyclerView-Ansicht angezeigt wird, wird es vom Fenster getrennt und beim erneuten Bildlauf wieder angefügt, sodass dieses Ereignis mehrmals ausgelöst wird.

Nachdem ich die Nullprüfung hinzugefügt hatte, war dies nur einmal pro RecyclerView-Element und das Problem ging weg! TL; DR!

2
Breeno

Reinigen Sie Ihr Projekt immer nach Änderungen an XML-Layoutdateien.

Bei Eclipse: Projekt> Reinigen

2
Zafer

Ich habe diesen Fehler behoben, ich benutze die commitNow() ersetzen commit()

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

Die Variable commitNow ist eine Synchronisationsmethode, die Methode commit() ist eine asynchrone Methode.

1
user1232595

In meinem Fall wurde diese Ausnahme ausgelöst, als ich verschiedene IDs für dasselbe Layoutelement (Fragmentplatzhalter) verwendet habe, während mehrere davon für verschiedene Build-Varianten vorhanden waren. Aus irgendeinem Grund funktioniert es perfekt, wenn Sie fragment zum ersten Mal ersetzen, aber wenn Sie versuchen, es erneut zu tun, wird diese Ausnahme angezeigt .. Wenn Sie mehrere Layouts für verschiedene Builds verwenden, verwenden Sie die gleiche ID Varianten.

1
T.K.

Dieses Problem ist aufgetreten, als ich versuchte, die Ansicht durch mein Fragment in onCreateView() zu ersetzen. 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 von onActivityCreated() behoben. 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 in onCreateView() zurückgeben, damit Sie sie später ersetzen können
  2. Sie können jeden Vorgang in dieser Ansicht in der folgenden Funktion in fragment liftcycle durchführen, z. B. onActivityCreated()

Hoffe das hilft!

1
Stephen Lin

Dies geschieht, wenn Sie von einem Fragment aus in einem anderen anrufen.

benutzen : 

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

Wenn Sie versuchen, ein Fragment in einem Fragment durch die Variable fragmentManager zu ersetzen, jedoch das übergeordnete Fragment nicht aufgeblasen wird, kann dies zu einem Problem führen.

In BaseFragment.JavaOnCreateView:

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 des korrekten Layouts für das Fragment:

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

Dieses Problem tritt auch auf, wenn Sie <include layout="@layout/your_fragment_layout"/> nicht in Ihren app_bar_main.xml einfügen.

0
Bbake Waikhom

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

Das Kernproblem ist, was Nick bereits darauf hingewiesen hat - Der Ansichtsbaum wurde noch nicht aufgebläht. Seine Lösung funktionierte jedoch nicht - dieselbe Ausnahme in onResume, onPostCreate usw.

Die Lösung besteht darin, dem Containerfragment einen Rückruf hinzuzufügen, um zu signalisieren, wenn es fertig 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();
    }

    //...
}
0

Ich hatte dasselbe Problem. Mein Fehler war, dass ich vergessen hatte, framlayout-xml-Code zu einem anderen Layout (für eine andere Sprache) der Aktivität hinzuzufügen. Meine App wurde für mehrere Sprachen erstellt, so dass ich für jede Aktivität zwei Layouts hatte. von rechts nach links und von links nach rechts 

0
tahaDev

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

0
Gauss

Der Container für Fragment bedeutet, dass Framelayout oder ein anderes Layout, in dem Fragment ersetzt wird, nicht vorhanden ist

Viel Spaß beim Codieren!

0
blackHawk

Es kommt auch vor, wenn Sie zwei Ansichten in zwei Fragmenten mit denselben IDs haben

0
Hossam Hassan

Ich hatte das gleiche Problem, weil ich versucht habe, Fragmente hinzuzufügen, bevor ich das Container-Layout zur Aktivität hinzugefügt habe.

0
Rohit