So fügen Sie ein Fragment in ein XML-Layout ein


73

Ich habe ein Layout, das ein Fragment wie folgt enthält:

<fragment
        android:id="@+id/mainImagesList"
        android:name="com.guc.project.ImagesList"
        android:layout_width="match_parent"
        android:layout_height="62dp"
        android:layout_below="@+id/addimagebutton"
        android:layout_weight="1"
        android:paddingTop="55dp" />

Jetzt muss ich dieses Fragment abrufen und umwandeln, damit ich es bearbeiten kann und die Updates angezeigt werden. Wie kann ich das machen ?!

EDIT: Ich denke, ich habe es geschafft, das Fragment zu bekommen, aber wenn ich einige Variablen ändere, erscheinen die Änderungen nicht!


Wenn die Änderungen nicht angezeigt werden, rufen Sie in Ihrer Ansicht invalidate () auf, um Änderungen neu zu zeichnen.
Tom Leese

Antworten:


138

Sie können die Fragmentinstanz wie folgt abrufen:

getSupportFragmentManager().findFragmentById(R.id.yourFragmentId)

22

Wenn das Fragment in ein anderes Fragment eingebettet ist, benötigen Sie dies getChildFragmentManager()jedoch nicht getFragmentManager(). Definieren Sie beispielsweise im Layout-XML das Fragment wie folgt:

<fragment 
    android:name="com.aventlabs.ChatFragment"
    android:id="@+id/chatfragment"
    android:background="#ffffff"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:layout_marginTop="50dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp" />

In Code können Sie die Fragmentinstanz folgendermaßen abrufen:

FragmentManager f = getChildFragmentManager();
FragmentTransaction transaction = f.beginTransaction();
chatFragment = f.findFragmentById(R.id.chatfragment);

if (chatFragment != null) {
   transaction.hide(chatFragment);
}
transaction.commit();

1
getChildFragmentManager () tat es, als ich Fragment verschachtelt hatte, Danke bro
Mrinmoy

Mein Fragment ist in die XML-Layoutdatei eingebettet, die das übergeordnete Fragment lädt. getChildFragmentManager hat für mich gearbeitet, getFragmentManager jedoch nicht. Vielen Dank!
TheZapper

4

Ich habe genau das gleiche in Android gemacht und den einfachsten Weg, dies in der Verwendung von Schnittstellen zu tun. Ich hatte eine Aktivität mit 6 Fragmenten und musste nur 3 davon aktualisieren.

ich benutze das

    final Integer numeroFragments = ((PagerAdapterOfe) mViewPager.getAdapter()).getCount();

    for (int i=0; i<numeroFragments; i++) {
        Object fragment = ((PagerAdapterOfe) mViewPager.getAdapter()).getItem(i);

        // If the fragment implement my interface, update the list
        if (fragment instanceof IOfertaFragment){
        ((IOfertaFragment) fragment).actualizaListaOfertas();
        }
    }

Wobei PageAdapterOfe mein Aktivitätsfragmentadapter ist. Ich schleife alle meine Fragmente und suche nach denen, die meine Schnittstelle implementieren. Wenn ich eine gefunden habe, führe ich die von meiner Schnittstelle definierte Methode aus und das ist!

Ich verwende diesen Code in der Aktivität, die alle Fragmente enthält. Als Antwort auf ein Sendesignal können Sie ihn dort platzieren, wo Sie ihn benötigen.

Die Schnittstelle:

public interface IOfertaFragment {

    public void actualizaListaOfertas();
}

Dies funktioniert, aber um auf der sicheren Seite zu sein, sollten Sie Fragment-Tags anstelle von Schleifen verwenden.
A. Steenbergen

1

Sie finden das Fragment mit findFragmentById (wenn Sie die Komponente kennen, in der es enthalten ist) oder mit findFragmentByTag (wenn Sie das Tag kennen).

Ich weiß nicht, welche Variablen Sie aktualisieren möchten, aber Sie können das Fragment mithilfe der FragmentTransaction-API durch ein anderes Fragment ersetzen.

Beispiele finden Sie unter http://developer.android.com/guide/components/fragments.html .


Wenn das Fragment nicht im Layout gezeichnet, sondern nur mit dem Fragment-Tag in XML deklariert wird, funktioniert das Ersetzen des Fragments nicht.
AouledIssa

1

Wenn Fragment in der Layoutdatei von Activity enthalten ist, kann es von SupportFragmentManager wie ... referenziert werden.

MyFragment myFragment= (MyFragment)getSupportFragmentManager().findFragmentById(R.id.FRAGMENTID)

Wenn Fragment in der Layoutdatei eines anderen Fragments enthalten ist, kann es von ChildFragmentManager wie ... referenziert werden.

 MyFragment myFragment= (MyFragment)getChildFragmentManager().findFragmentById(R.id.FRAGMENTID)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.