So kommunizieren Ihre Android-Fragmente miteinander: Ein Leitfaden

In Android Anwendungen gibt es verschiedene Möglichkeiten, Daten zwischen Aktivitäten zu übergeben. Bei der Arbeit mit Fragmenten erfordert dies jedoch eine etwas andere Herangehensweise. In diesem Blogpost werden wir die Schritte zur Übergabe von Daten zwischen Fragmenten erklären. Wir werden eine Anwendung mit einer TabLayout und ViewPager implementieren, die es ermöglicht, Daten von einem Fragment an ein anderes zu senden.

Projektstruktur

Unser Projekt besteht aus zwei Fragmenten (FragmentA und FragmentB), die durch eine MainActivity mit einem ViewPager und einem TabLayout verbunden sind. FragmentA sendet eine Nachricht an FragmentB, die dann dort angezeigt wird. Die Übergabe der Daten erfolgt über eine benutzerdefinierte Schnittstelle.

Schritt-für-Schritt-Anleitung

1. Definieren Sie die Schnittstelle zur Datenübertragung

Erstellen Sie in FragmentA eine Schnittstelle MyInterface, die eine Methode zur Übergabe eines Strings definiert:

public class FragmentA extends Fragment {

    MyInterface myInterface;

    interface MyInterface {
        void send(String data);
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {
            myInterface = (MyInterface) context;
        } catch (ClassCastException e) {
            throw new ClassCastException("Activity must implement MyInterface");
        }
    }

    // Der Button-Listener, um Daten zu senden
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Button button = view.findViewById(R.id.button);
        final EditText editText = view.findViewById(R.id.editText);

        button.setOnClickListener(v -> {
            String data = editText.getText().toString();
            myInterface.send(data);
        });
    }
}

Diese Schnittstelle muss in der Aktivität implementiert werden, die die beiden Fragmente hostet.

2. Implementieren Sie die Schnittstelle in der MainActivity

In der MainActivity implementieren Sie die Schnittstelle MyInterface und übergibst die Daten an FragmentB:

public class MainActivity extends AppCompatActivity implements FragmentA.MyInterface {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ViewPager viewPager = findViewById(R.id.viewPager);
        TabLayout tabLayout = findViewById(R.id.tabs);
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());

        viewPager.setAdapter(adapter);
        tabLayout.setupWithViewPager(viewPager);
    }

    @Override
    public void send(String data) {
        FragmentB fragmentB = (FragmentB) getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.viewPager + ":1");
        if (fragmentB != null) {
            fragmentB.receiveData(data);
        }
    }
}

Die Methode send(String data) in MainActivity wird aufgerufen, wenn FragmentA Daten sendet. Die Methode sucht nach FragmentB und übergibt die empfangenen Daten an dessen Methode receiveData.

3. Daten in FragmentB empfangen

In FragmentB erstellen Sie eine Methode receiveData, die die übergebenen Daten verarbeitet und in einer TextView anzeigt:

public class FragmentB extends Fragment {

    private TextView textView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_b, container, false);
        textView = view.findViewById(R.id.textView);
        return view;
    }

    public void receiveData(String data) {
        textView.setText("Empfangene Daten: " + data);
    }
}

Damit ist die Implementierung der Datenübertragung abgeschlossen.

XML Layout für die MainActivity

Das XML-Layout für die MainActivity definiert das Grundgerüst der Anwendung. Es enthält ein TabLayout und ein ViewPager:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</android.support.design.widget.CoordinatorLayout>

Dieses Layout stellt die Grundstruktur der App bereit, in der die Fragments geladen und angezeigt werden.

ViewPagerAdapter zur Initialisierung der Fragmente

Der ViewPagerAdapter ist dafür verantwortlich, die Fragmente in den verschiedenen Tabs zu initialisieren:

public class ViewPagerAdapter extends FragmentPagerAdapter {

    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return new FragmentA();
            case 1:
                return new FragmentB();
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return 2;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "Tab 1";
            case 1:
                return "Tab 2";
            default:
                return null;
        }
    }
}

Fazit

In diesem Blogbeitrag haben wir gelernt, wie man Daten zwischen Android-Fragmenten mittels einer benutzerdefinierten Schnittstelle und einem ViewPager übergibt. Diese Technik ist besonders nützlich, wenn es darum geht, Fragments innerhalb einer Anwendung effizient miteinander kommunizieren zu lassen. Mit der richtigen Struktur und Implementierung können Sie so eine flexible und modularisierte App entwickeln.

Kostenlosen Account erstellen

Registrieren Sie sich jetzt und erhalten Sie Zugang zu unseren Cloud Produkten.

Das könnte Sie auch interessieren: