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?

5voto

Yamashiro Rion Punkte 1440

Ich verwende View Binding in meinem Projekt und war unaufmerksam, um hinzuzufügen setContentView() nach dem Aufpumpen ActivityHelloWorldBinding Klasse:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityHelloWorldBinding.inflate(layoutInflater)

    // Add this line.
    setContentView(binding.root)
}

4voto

user1232595 Punkte 39

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

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

Le commitNow eine Sync-Methode ist, wird die commit() Methode ist eine asynchrone Methode.

4voto

Arvin Sanaei Punkte 103

Dies geschieht, wenn Sie von einem Fragment innerhalb eines anderen Fragments aufrufen.

verwenden:

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

3voto

PearsonArtPhoto Punkte 37354

Ich hatte das gleiche Problem, lassen Sie mich meinen Code zu posten, so dass Sie alle es sehen können, und nicht das gleiche tun, was ich tat.

@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 die Fragmente eingerichtet habe, bevor ich setContentView . Ooops.

3voto

Suragch Punkte 420096

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

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


Übrigens: Wenn Sie bereits alles andere ausprobiert haben, was auf dieser Seite (und im gesamten Internet) vorgeschlagen wird, und sich stundenlang die Haare raufen, sollten Sie sich überlegen, ob Sie diese lästigen Fragmente nicht einfach wegwerfen und zu einem guten alten Standardlayout zurückkehren wollen. (Genau das wollte ich auch gerade tun, als ich mein Problem entdeckte.) Sie können das Containerkonzept weiterhin verwenden. Anstatt ihn jedoch mit einem Fragment zu füllen, können Sie das xml include Tag, um es mit demselben Layout zu füllen, das Sie in Ihrem Fragment verwendet hätten. Sie könnten in Ihrem Hauptlayout etwas Ähnliches tun:

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

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

</FrameLayout>

何所 former_fragment_layout ist der Name der Xml-Layoutdatei, die Sie in Ihrem Fragment verwenden wollten. Siehe Wiederverwendung von Layouts mit include für weitere Informationen.

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